想定状況
スプレッドシートのチェックボックスがチェックされた瞬間に外部APIを叩くなどの状況
直感的だがスマートでない実装方法
別のセルに前後の状態を保存しておかなければ
特定のチェックボックスセルでチェックがついた/外れた瞬間に操作を実行するのは不可能
と思っていませんか?必ずしもそうする必要はありませんし、そうすればシートが複雑になります。
僕なりのスマートな解決策
チェックボックスの場合は前後の値がTRUE/FALSEのみに限定されるので
シート変更の変更トリガーでアクティブセルとその値を確認すれば所望の操作が実現できます。
main.gs
//トリガーを手動で設定しなくともシートの変更時にトリガーされる
function onEdit(e){
const sheet = SpreadsheetApp.getActiveSheet()
// 例として2行3列のチェックボックスセルを監視したいとする
const target={
row:2,
col:3
}
listenForCheckBoxChange(sheet,target)
}
//チェックボックスセルの変更を確認
function listenForCheckBoxChange(sheet,target){
//監視するチェックボックスセル上が選択されている i.e. アクティブになっている
//なお、これがtrueの場合、シートに変更があり、
//アクティブセルから変更はチェックボックス上で直前に行われた と判断できます
const isTargetCellActive= (sheet.getActiveCell().getRow()==target.row)
&&(sheet.getActiveCell().getCol()==target.col)
if(isTargetCellActive){
//そのセルがチェックされているかどうか i.e. TRUEになっているかどうか
//監視するチェックボックスの値が変更され、かつ直後にTRUEになっている場合は
//FALSE->TRUEと変化したと考えて差し支えありません。
//ちなみにチェックボックスの値を取得したときはJavaScriptのboolean value (true/false)が返されます
const isTargetChecked=sheet.getActiveCell().getValue()
if(isTargetChecked){
Logger.log("監視しているチェックボックスの値が変更され、かつチェックはtrueに変化しました。")
// 監視チェックボックスがチェックされた時に行いたい処理
// ...
}else{
Logger.log("監視しているチェックボックスの値が変更され、かつチェックはfalseに変化しました。")
// 監視チェックボックスがチェック解除された時に行いたい処理
// ...
}
}
}
チェックボックス以外のセルには応用できない
ただしチェックボックスでない通常のセルでは同様に前後をトラックして、
それに応じて処理を分岐するのは難しく、別のセルなどに状態を保存する仕組みを作る必要があります。
コメント
実際にGASと外部APIを連携させる業務で利用する際に思いつきました。