zooo-log

読んだものとか、学んだこととか

GlideでSpreadSheetに情報連携させた後GASを動かすときに躓いた話

つまずきポイントは以下の通り

  • GASのトリガー設定
  • eventの種別

それぞれ詳しく書いていきます。

GASのトリガー設定

これはググるとすぐ出てきますが、Glideと連携させる場合は、 編集時ではなく、変更時にしないとGlideがイベントを発火させてくれず、 スプレッドシートにデータを追加してくれるものの、GASのイベントを発火するには至りません。

  • 編集時の挙動:Glideでデータ追加リクエスト→SpreadSheetにデータ追加|ここまで
  • 更新時の挙動:Glideでデータ追加リクエスト→SpreadSheetにデータ追加→GASのイベントが発火

そのため、以下のように設定する必要があります。

f:id:zoo666:20211023020031p:plain
トリガー設定

こうすることで、トリガーで設定した関数をSpreadSheetのデータ追加に応じて実行することができるようになります。

eventの種別

トリガー設定が編集時に動くものではなく、変更時に動くもの、ということで、 eventの種別もonEditのイベントではなく、onChangeのイベントになります。

developers.google.com

上記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をご参照ください。

developers.google.com

developers.google.com

Glideはじめて触りましたが、ローコードという割に、最低限マクロなどの実装経験無いとやりたいことやるのは難しいのかな、と感じた次第です。