GASでスプレッドシートに
チェックボックスをコードで挿入・判定する方法
チェックボックス(クリックでオン・オフを切り替えるセル)を、手作業のメニュー操作ではなくinsertCheckboxesでコードから一括挿入し、チェック状態をコードで判定する方法を、動くコードで解説します。 onEditと組み合わせれば「チェックした瞬間に自動処理」も作れます。
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開発でご相談いただけます。