チェックボックスの列を読んだのに、"FALSE"まで処理対象になる場合は、値を真偽値へ変える方法を確認します。JavaScriptでは空でない文字列は真として扱われるので、if (value)だけでチェック状態を判断すると意図とずれることがあります。
GASでは、セルがチェック状態かを調べるisCheckedを使えます。戻り値にはtrueとfalseだけでなくnullもあるため、未チェックと不正な状態を分けます。以下はチェック済みの行番号を確認する読み取り専用の例です。
標準値とカスタム値を分ける
通常のチェックボックスでは、取得した値は真偽値のtrueかfalseです。入力規則でチェック時を「送信対象」、未チェック時を「保留」のように変えると、セルの値もその設定に応じた文字列になります。
同じ見た目のチェックボックスでも、値が同じとは限りません。既存シートを引き継ぐ際は、まず入力規則を開き、チェック時と未チェック時の値を確認してください。文字列の"true"をJavaScriptのtrueと同じものとして比較しないようにします。
公式のRangeのisCheckedでは、カスタム値を持つセルの例と、不正値でnullになる例が示されています。値を直接読む方法との違いはスプレッドシートの読み書きから確認できます。
セルごとに状態を判定する
複数セルの範囲へ一度だけisCheckedを呼ぶと、全体の状態を確認することになります。行ごとに処理対象を選ぶなら、各セルを個別に調べます。
function checkedRows(range) {
if (range.getNumColumns() !== 1) {
throw new Error('チェック列を1列だけ指定してください');
}
const selected = [];
for (let i = 1; i <= range.getNumRows(); i++) {
const state = range.getCell(i, 1).isChecked();
const row = range.getRow() + i - 1;
if (state === null) {
throw new Error('チェック欄の入力規則と値を確認: ' + row + '行目');
}
if (state === true) selected.push(row);
}
return selected;
}
function previewCheckedRows() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('チェック練習');
if (!sheet) throw new Error('チェック練習シートがありません');
console.log(JSON.stringify(checkedRows(sheet.getRange('A2:A4'))));
}
練習用のA2:A4へチェックボックスを入れ、A2とA4をオン、A3をオフにします。期待するログは[2,4]です。カスタム値に変えても、入力規則と値が一致していれば同じ行番号を選ぶ想定です。ここではメールの送信やセルの更新は行いません。
nullを未チェックへ置き換えない
入力規則を消したセルや、設定と違う値が入ったセルは、そのまま「未チェック」と扱わないようにします。処理済みか未処理かを決められない状態を見逃すと、必要な行を対象から外してしまうためです。
上のコードは不明なセルが1つでもあれば全体を止めます。不正な行だけを別リストへ出して処理を続ける設計もありますが、その場合は保留した行と理由が残るようにしてください。nullを無条件にfalseへ変えると、その違いが失われます。
練習ではA3の入力規則を一度外し、3行目を示すエラーになるかを確認します。次に規則を戻し、3セルすべてをオン・すべてをオフにして、対象行の数を比べます。チェックの混在だけでなく、不正な状態も含めて確認することがポイントです。
対象行の記録と処理結果を分ける
チェック済みであることと、後続の処理が完了したことは別です。送信対象のチェックを先に外してしまうと、途中で失敗した行を見失うことがあります。実際の処理を追加するときは、対象IDと結果の記録も用意します。
この例の分岐はローカルの代用セルで確認しました。Google上のチェックボックス操作や大量行の実行時間は未確認です。行ごとのサービス呼び出しが増えるため、大きな表では対象範囲を絞り、必要に応じて値と入力規則の一括取得を検討してください。
チェック欄を台帳で使う前に、対象・処理・完了をどう記録するかは在庫と台帳更新の設計で整理できます。
