GlideでSpreadSheetに情報連携させた後GASを動かすときに躓いた話
つまずきポイントは以下の通り
- GASのトリガー設定
- eventの種別
それぞれ詳しく書いていきます。
GASのトリガー設定
これはググるとすぐ出てきますが、Glideと連携させる場合は、 編集時ではなく、変更時にしないとGlideがイベントを発火させてくれず、 スプレッドシートにデータを追加してくれるものの、GASのイベントを発火するには至りません。
- 編集時の挙動:Glideでデータ追加リクエスト→SpreadSheetにデータ追加|ここまで
- 更新時の挙動:Glideでデータ追加リクエスト→SpreadSheetにデータ追加→GASのイベントが発火
そのため、以下のように設定する必要があります。
こうすることで、トリガーで設定した関数をSpreadSheetのデータ追加に応じて実行することができるようになります。
eventの種別
トリガー設定が編集時に動くものではなく、変更時に動くもの、ということで、 eventの種別もonEditのイベントではなく、onChangeのイベントになります。
上記URLのページに、onChangeで渡されるイベントオブジェクトの構造があったので、それを参考に、、、 と思ったのですが、書かれている一覧にはSpreadSheetのデータに関する項目が見つからず。。。
結局、実際に渡されたオブジェクトを確認し、実装しました。 以下は実際に吐き出されたオブジェクトです。
{ authMode: { toString: [Function: toString], name: [Function: toString], toJSON: [Function: toString], ordinal: [Function: ordinal], compareTo: [Function: compareTo], NONE: { toString: [Function: toString], name: [Function: toString], toJSON: [Function: toString], ordinal: [Function: ordinal], compareTo: [Function: compareTo], NONE: [Circular], CUSTOM_FUNCTION: [Object], LIMITED: [Object], FULL: [Circular] }, CUSTOM_FUNCTION: { toString: [Function: toString], name: [Function: toString], toJSON: [Function: toString], ordinal: [Function: ordinal], compareTo: [Function: compareTo], NONE: [Object], CUSTOM_FUNCTION: [Circular], LIMITED: [Object], FULL: [Circular] }, LIMITED: { toString: [Function: toString], name: [Function: toString], toJSON: [Function: toString], ordinal: [Function: ordinal], compareTo: [Function: compareTo], NONE: [Object], CUSTOM_FUNCTION: [Object], LIMITED: [Circular], FULL: [Circular] }, FULL: [Circular] }, changeType: 'EDIT', source: {}, triggerUid: 'xxxxxxxx', user: { email: '', nickname: '' } }
上記オブジェクトの中の、source
の中に、スプレッドシートで更新されたデータに関する情報が含まれています。
その情報を取得する場合は、以下のような実装になります。
e.source.getActiveSheet(); // 更新のあったSheetオブジェクトを取得 e.source.getActiveRange(); // 更新された範囲のRangeオブジェクトを取得 e.source.getActiveRange().getA1Notation(); // 更新された範囲のRangeオブジェクトからA1Notation型で範囲を取得 e.source.getActiveRange().getCell(1,1).getValue(); // 更新された範囲の内、1行目の1列目の値を取得
SpreadSheetオブジェクトとRangeオブジェクトのメソッドについては、公式Docをご参照ください。
Glideはじめて触りましたが、ローコードという割に、最低限マクロなどの実装経験無いとやりたいことやるのは難しいのかな、と感じた次第です。