記事内に広告が含まれています。

【GAS】セルが編集されたら自動処理を行う

GAS

Googleスプレッドシートで作業していると、セルを編集したら別の処理を自動で実行したいことはありませんか?

例えば、チェックボックスにチェックを入れたらメッセージを表示したり、ステータスを「完了」に変更したら、その行の背景色を変えたり。

Google Apps Script(GAS)を使えば、このような処理を自動化できます。

今回は、簡単なタスク管理表を使って、セルの編集をきっかけに実行される3つの自動処理を作ってみました。

セルを編集するだけで、いろんな処理を自動実行できちゃいます。今回は簡単なタスク管理表で試してみます。

投稿者
もも

40代・大阪の女性フリーランスSE。
主に業務自動化の仕事をしています。UiPathを中心に、PythonやGAS、生成AIにも挑戦中。実際に作ったツールや、学んだことなど発信しています。

ももをフォローする

今回作ったもの

今回は、タスクを1件だけ登録したシンプルなスプレッドシートを用意しました。

「作業開始チェック」にはチェックボックス、「ステータス」には「未完了」「作業中」「完了」のプルダウンを設定しています。

このタスク管理表に、次の3つの機能を追加します。

  1. 作業開始チェックを入れると、メッセージを表示する
  2. ステータスを「完了」にすると、行の背景色をグレーにする
  3. ステータスを「完了」にすると、完了日時を自動記録する

実例① チェックボックスにチェックを入れたらメッセージを表示

まずは「作業開始チェック」にチェックを入れると、メッセージが表示されるようにしてみました。

B2セルのチェックボックスをオンにすると、スプレッドシートの右下に「作業を開始しました」と表示されます。

メッセージは3秒間表示され、その後自動的に消えます。

この処理には、GASの toast() というメソッドを使っています。

e.source.toast("作業を開始しました", "作業開始", 3);

toast() は、スプレッドシート上に一時的な通知を表示する機能です。

今回は、チェックボックスがオンになったときだけ実行されるようにしています。

実例② ステータスを「完了」にしたら背景色を変更

次は、ステータスに応じてセルの背景色を変更してみました。

C2セルには「未完了」「作業中」「完了」の3つの選択肢を持つプルダウンを設定しています。

ステータスを「完了」に変更すると、タスクAの行全体がグレーになります。

背景色の変更には、setBackground() を使っています。

sheet.getRange("A2:D2").setBackground("#D9D9D9");

今回は、A2~D2セルの背景色をグレーに変更しています。

なお、ステータスを「未完了」や「作業中」に戻すと、背景色も元に戻るようにしています。

完了したタスクが一目で分かるので、タスク管理表などで使えそうですね。

実例③ ステータスを「完了」にしたら完了日時を記録

最後は、ステータスを「完了」に変更したとき、D2セルに完了日時を自動で記録する処理です。

日時の取得には、new Date() を使用しています。

sheet.getRange("D2").setValue(new Date());

これだけで、セルに現在の日時を書き込むことができます。

実際のコードでは、表示形式を「yyyy/MM/dd HH」に設定しています。

また、ステータスを「未完了」や「作業中」に戻した場合は、完了日時を削除するよう処理も可能です。

完了日時を手入力しなくていいのは便利!入力忘れも防げそう。

セルの編集をきっかけに処理を実行する仕組み

今回の3つの処理には、GASの onEdit(e) という関数を使用しています。


function onEdit(e) {

  // 編集されたシート
  const sheet = e.range.getSheet();

  // タスク管理シートのみ対象
  if (sheet.getName() !== "タスク管理") return;

  const cell = e.range.getA1Notation();
  const value = e.range.getValue();

  // ① 作業開始チェック
  if (cell === "B2" && value === true) {
    e.source.toast("作業を開始しました", "作業開始", 10);
  }

  // ② ③ ステータス変更
  if (cell === "C2") {
    const completed = value === "完了";

    // ②完了なら背景をグレーにする
    sheet.getRange("A2:D2")
      .setBackground(completed ? "#D9D9D9" : null);

    // ③完了日時を記録する
    const dateCell = sheet.getRange("D2");
    if (completed) {
      dateCell.setValue(new Date());
      dateCell.setNumberFormat("yyyy/MM/dd HH:mm");
    }
  }
}

onEdit(e) は、Googleスプレッドシートのセルがユーザーによって編集されたときに、自動実行される関数です。

GASには、特定の出来事をきっかけに処理を実行する「トリガー」という仕組みがあります。

onEdit(e) は、その中でも「シンプルトリガー」と呼ばれるもの。

function onEdit(e) {
  // セルが編集されたときに実行する処理
}

この名前で関数を作成するだけで、セルの編集時に自動実行されます。

別途トリガーの登録をする必要はありません。

eには編集されたセルの情報が入っている

onEdit(e) の e は「イベントオブジェクト」と呼ばれ、編集されたセルに関する情報が入っています。

今回のコードでは、次のように編集されたセルの位置と値を取得しています。

const cell = e.range.getA1Notation();
const value = e.range.getValue();

例えば、B2セルのチェックボックスをオンにした場合、

  • cell:"B2"
  • value:true

となります。

この情報を利用して、どのセルが編集されたかを判定し、処理を分岐させています。

onEdit(e)を使うときの注意点

① Apps Scriptの実行ボタンから直接実行しない

onEdit(e) は、スプレッドシートの編集時にGoogleからイベント情報が渡される仕組みです。

Apps Scriptの画面から直接実行すると、イベント情報 e が渡されないため、今回のように e.range を参照するコードではエラーになります。

動作確認は、実際にスプレッドシートのセルを編集して行います。

② GASによるセルの変更では動作しない

onEdit(e) が実行されるのは、ユーザーがスプレッドシートのセルを編集したときです。

GASの setValue() などでセルを書き換えても、onEdit(e) は実行されません。

また、数式の再計算によって表示結果が変わった場合も対象外です。

③ 実行時間に制限がある

onEdit(e) のようなシンプルトリガーは、1回あたり30秒の実行時間制限があります。

今回のような簡単なセル操作なら通常は問題ありませんが、大量のデータを処理する場合などには注意が必要です。

④ 今回のコードは1つのタスクだけが対象

今回のサンプルは、タスクAの1行だけを対象としています。

複数のタスクに対応させる場合は、編集された行番号などを取得して処理する必要があります。

onEdit(e)は便利だけど、GASからセルの値を変更しても動かない。この違いは覚えておきたい!

まとめ

今回は、GASの onEdit(e) を使って、セルの編集をきっかけに処理を自動実行する3つの例を紹介しました。

  • チェックボックスをオンにしたらメッセージを表示
  • ステータスが「完了」になったら背景色を変更
  • ステータスが「完了」になったら完了日時を記録

どれも小さな処理ですが、組み合わせることでタスク管理表を少し便利にできます。

GASは、GoogleスプレッドシートなどのGoogleサービスを自動化するのに便利なツールです。

今後も、実際に作ってみたものを中心に、身近な業務自動化の例を紹介していきたいと思います。