GASでスプレッドシートに
チェックボックスをコードで挿入・判定する方法

チェックボックス(クリックでオン・オフを切り替えるセル)を、手作業のメニュー操作ではなくinsertCheckboxesでコードから一括挿入し、チェック状態をコードで判定する方法を、動くコードで解説します。 onEditと組み合わせれば「チェックした瞬間に自動処理」も作れます。

|対象: GAS / スプレッドシート / チェックボックス

Table of Contents

チェックボックスをコードで扱うメリット

チェックボックスは、タスクの完了・未完了、承認・未承認、対象・対象外などを「クリック1つ」で切り替えられる便利な入力補助です。 メニューの「挿入 › チェックボックス」からも作れますが、GASでコード化すると次のメリットがあります。

行が増えても自動で付与

データ追加時にトリガーで実行すれば、新しい行にもチェックボックスを自動で付けられる

チェック済みだけを一括処理

true/falseで判定できるので、完了行だけ集計・移動・通知といった処理につなげられる

チェックした瞬間に動かせる

onEditと組み合わせて、チェックを入れたら日時記録やSlack通知を自動実行できる

解除・リセットもコード1行

月初にすべてのチェックを外すなど、定型のリセット作業を自動化できる

最小コード:範囲にチェックボックスを挿入する

チェックボックスを付けるには、対象の範囲をgetRangeで取得してinsertCheckboxes()を呼ぶだけです。内部的にはチェックボックス型の入力規則(データの入力規則)が設定され、セルの値はtrue /falseになります。

function insertCheckboxColumn() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("タスク");

  // データがある行数を調べる(1行目はヘッダー想定)
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return; // データが無ければ何もしない

  // B2 から最終行まで、チェックボックス列を一括で挿入
  // 例: A=タスク名 / B=完了チェック
  sheet.getRange(2, 2, lastRow - 1, 1).insertCheckboxes();
}

getRange(2, 2, lastRow - 1, 1)は「2行目・2列目(B2)を起点に、行数=lastRow-1・列数=1」という指定です。ヘッダー行を除いてB列全体にまとめて挿入できます。

チェック済みの行だけ処理する(true/false判定)

チェックボックスのセルは、値としてtrue(チェック済み)かfalse(未チェック)を返します。 大量の行を扱うときは、1セルずつ読まずにgetValues()で二次元配列にまとめて取得し、値が=== trueの行だけ処理するのが速くて安全です。

function processCheckedRows() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("タスク");
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;

  // A列=タスク名, B列=チェックボックス を一括取得
  const values = sheet.getRange(2, 1, lastRow - 1, 2).getValues();

  values.forEach((row, i) => {
    const taskName = row[0];
    const checked = row[1]; // チェック済みなら true, 未チェックなら false

    if (checked === true) {
      // チェックが入っている行だけ処理する
      Logger.log((i + 2) + "行目「" + taskName + "」は完了");
    }
  });
}

値の比較は=== trueのように厳密比較にしておくと、空セルや文字列が混ざっていても誤判定しにくくなります。

TRUE/FALSE以外の独自値でチェックボックスを作る

insertCheckboxes(チェック時の値, 未チェック時の値)のように2つの引数を渡すと、TRUE/FALSE以外の値を切り替えるチェックボックスになります。 「完了 / 未対応」のように、セルの値そのものを意味のある文字列にできるのが利点です。

function insertStatusCheckboxes() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("タスク");
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;

  // チェック時="完了" / 未チェック時="未対応" を切り替えるチェックボックス
  sheet
    .getRange(2, 2, lastRow - 1, 1)
    .insertCheckboxes("完了", "未対応");

  // この場合、セルの値は true ではなく文字列になる。
  // 判定は value === "完了" のように行う。
}

独自値の場合、チェック済みかどうかはvalue === "完了"のように「指定した値と一致するか」で判定します。trueでは判定できない点に注意してください。

チェックを入れた瞬間に動かす(onEdit連携)

チェックを入れた瞬間に処理を走らせたいときはonEditトリガー(セル編集で自動実行される特別な関数)を使います。編集イベントeから編集セルと入力値を取り出し、対象列かつチェックが入ったときだけ処理します。

// チェックを入れた瞬間に、その行に完了日時を書き込む
function onEdit(e) {
  const range = e.range;
  const sheet = range.getSheet();

  // 「タスク」シートの B列(2列目) 以外は無視
  if (sheet.getName() !== "タスク") return;
  if (range.getColumn() !== 2) return;

  // チェックが入った(true)ときだけ動かす
  if (e.value === "TRUE") {
    // 同じ行の C列に完了日時を記録する
    const now = Utilities.formatDate(
      new Date(),
      "Asia/Tokyo",
      "yyyy/MM/dd HH:mm"
    );
    sheet.getRange(range.getRow(), 3).setValue(now);
  }
}

e.valueはチェック時に文字列"TRUE"、 外したときは"FALSE"で渡ってきます(真偽値ではなく文字列)。なお、外部APIの呼び出しやメール送信など権限が必要な処理は、この簡易onEditでは実行できません。 その場合はScriptApp.newTriggerでインストール型のonEditトリガーをコードから登録してください。

チェックの解除・一括リセットと削除

「先月分のチェックを全部外す」といったリセットはuncheck()で一括実行できます。逆に全部チェックするならcheck()。 チェックボックスそのものを消して普通のセルに戻したいときはremoveCheckboxes()を使います。

function resetChecks() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("タスク");
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;

  const range = sheet.getRange(2, 2, lastRow - 1, 1);

  // すべてのチェックを外す(未チェックに戻す)
  range.uncheck();

  // すべてチェックを入れたいときは range.check();

  // チェックボックスそのものを消して普通のセルに戻すには:
  // range.removeCheckboxes();
}

uncheck()は値を未チェックに戻すだけでチェックボックス自体は残ります。removeCheckboxes()は入力規則ごと外すので、目的に合わせて使い分けてください。

実務での注意点

1. 既存の値は上書きされる

すでに文字や数値が入っているセルに insertCheckboxes すると、値が true/false(または指定値)に置き換わります。 データが入っている列に付けるときは、空いている専用列に挿入するのが安全です。

2. onEditの e.value は文字列で来る

セルの値を getValue() で読むと真偽値の true/false ですが、onEditトリガーの e.value は文字列の "TRUE" / "FALSE" です。判定する場所によって型が違う点に注意してください。 複数セルをまとめて編集した場合は e.value が渡らないこともあります。

3. 簡易onEditでできることは限られる

関数名を onEdit にするだけの簡易トリガーは、同じスプレッドシート内の読み書きはできますが、 メール送信・外部API・他ファイルへのアクセスなど権限が必要な処理はできません。 それらを動かすには、コードでインストール型のonEditトリガーを登録します。

まとめ

GASのチェックボックスは、insertCheckboxesで挿入し、値の true /falseで判定するのが基本です。独自値ならinsertCheckboxes(値1, 値2)、 リセットは uncheck、 削除は removeCheckboxes。 onEditと組み合わせれば「チェックした瞬間に自動処理」まで作れます。進捗管理や承認フローの入力補助として、日々の業務にそのまま組み込めます。

よくある質問

チェックボックスを置きたい範囲を getRange で取得し、range.insertCheckboxes() を呼ぶだけです。例えば sheet.getRange("B2:B100").insertCheckboxes() で、B2からB100までが未チェックのチェックボックスになります。既にデータがある範囲でも、値が true/false に置き換わる点に注意してください。

チェックボックスのセルの値は true / false(真偽値)として読めます。getValue() が true ならチェック済み、false なら未チェックです。大量の行を判定するときは getValues() で二次元配列にまとめて取得し、各行の値が true かどうかで分岐すると高速です。

作れます。insertCheckboxes("完了", "未") のように第1引数にチェック時の値、第2引数に未チェック時の値を渡すと、その2値を切り替えるチェックボックスになります。この場合セルの値は true ではなく指定した文字列になるため、判定は value === "完了" のように行います。

onEdit トリガーを使います。編集イベントの e.range と e.value を見て、対象の列かつ値が true のときだけ処理を実行します。外部APIの呼び出しなど権限が必要な処理は、簡易onEditでは動かないため、インストール型のonEditトリガーをコードで登録してください。

range.removeCheckboxes() を呼ぶと、チェックボックス(入力規則)が外れて通常のセルに戻ります。チェックだけを一括で外して未チェック状態に戻したい場合は range.uncheck()、逆に全部チェックするなら range.check() を使います。

入力・進捗管理を
自動化する。

チェックボックスによる進捗管理はもちろん、チェックを起点にした通知・集計・帳票作成まで、 スプレッドシートの入力補助と業務フローの自動化をGAS開発でご相談いただけます。

AI×GAS自動化を見る