見出し画像

【GAS】 特定のシートの特定の範囲が編集された時だけ処理を行いたい時。e.range/throw new Error/Class console

今日の雑メモ。

前置き

今日のネタは↓このnoteとも関連しています。

特定の範囲に絞って処理(前回のnoteではsetNote)を効かせることは出来た。
更に、特定のシートという条件も付け加えたい。

コード例は下記の通り。
前提として、シートのコンテナバインドスクリプトで、インストラーブルトリガーは編集時という設定である。

コード列1

function myTriger1(e) {
  const range = e.range; //編集したセル

  const sheet = e.source.getActiveSheet();//編集したシートを取得

  //シート名が管理票以外だった場合はスクリプト終了
  if (sheet.getName() !== '管理票') {
    console.log('別シートが変更されたのでスクリプトは終了します。');
    return;
  }

  //ファイル名の列(5列目)以外が変更された場合はスクリプトは終了
  if (range.columnStart !== 5) {
    console.log('ファイル名の変更はありませんでした。');
    return;
  }

  console.log('管理票シートの5列目にファイル名の変更あり!');

 // 以下の処理
}

コード例2

function myTriger2(e{
​
  const range = e.range; //編集したセル

  const sheet = e.source.getActiveSheet();//編集したシートを取得

  // シート名が管理票以外だった場合はスクリプト終了
  if (sheet.getName() !== '管理票'throw new Error('別シートが変更されたのでスクリプトは終了します。');
  
//ファイル名の列(5列目)以外が変更された場合はスクリプトは終了
  if (range.columnStart !== 5throw new Error('ファイル名の変更はありませんでした。');
​
  console.log('管理票シートの5列目にファイル名の変更あり!');

  // 以下の処理
}


コード例1とコード例2の違い

myTriger1 と  myTriger2 では、条件に合致しないときのコードがconsole.log か throw new Error で違う。

実行数のところで見るとその違いがよく分かる。
試しに、ターゲットとなるシート以外を編集し、その後、実行数を見るとこうなっている。

それぞれ、クリックすると下図のように表示のされ方も異なっていることが分かる。

throw new Error は文字通りエラーを返している。

throw new Error は、try...catch文でエラーの処理をする際に使われているようだ。

うーん、throw、try...catch はまだよく理解してないな。

Class console

logを馬鹿の一つ覚えで使っていたが、改めてリファレンスを見ると、いろいろなMethodがあった。

引数の違いを無視すると、Class consoleのMethodは6種のようだ。
error()
info()
log()
time(label)
timeEnd(label)
warn()

入力候補にもちゃんと出ていた。

そういや、timeとtimeEndはノンプロ研の講座でもちらっとやってたな。

リファレンスに示されているサンプルコードにwarn()を追加して動かすと下図のようになる。

念のため実行数の箇所も見てみると同様になっている。


e.source.getActiveSheet()の考え方

Event Objects のリファレンスを読むとよく理解できる。

eはイベントオブジェクト。トリガーが発生したときに、関数にイベントオブジェクトを渡すことができる。下記のように書く。仮引数として e をmyTriger の関数に渡している。

function myTriger(e{
  // 処理
}


Event Objects のリファレンスのGoogle Sheets eventを見てみると、sourceがある。
(Google Docs events やGoogle Slides events、Google Forms events にもsourceがある。)

source はスクリプトがバインドされているGoogleスプレッドシートファイルを表すスプレッドシートオブジェクトなので、SpreadsheetAppとほぼ同義になる。なので、SpreadsheetApp.getActiveSheet()と同じ感覚で下記のように書くことができる。

const sheet = e.source.getActiveSheet();


長くなるので、console.logの書き方については別のnoteにする。

#ノンプロ研
#百人組手
#GAS
#GoogleAppsScript

いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!