今までの記事一覧
- GASでGoogleForm回答を取得するなら lastRow?(e)?試してみた
- onFormSubmit(e)を手動実行でデバッグする方法 <この記事
- どっちを使う?onFormSubmit(e)の values と namedValues の違いと使い分け
- onFormSubmit(e) の e.values 配列順のしくみ
- Googleフォームで質問を変えても壊れない!cleanFormData(e)でnamedValues防御力をアップ
- Googleフォームの質問変更に負けない!「部分一致」と「秘密の暗号」でcleanFormData(e)の防御力を鉄壁に
- 手動コピペはもう卒業!Googleフォームの回答別に処理を自動仕分け
- Googleフォームで同時に大量送信されても踏ん張る!LockServiceで順番制御!try - catch - finally でバトンを繋げ!
- LockServiceでは順番は守れない?受付番号で順序を保証する方法
前提
この記事は、フォーム回答を保存している スプレッドシート側のGAS を前提にしています。
トリガーは以下を設定しています。
- スプレッドシートから
- フォーム送信時
前回の記事では、GoogleFormの回答取得方法として
- lastRow
- (e)
を比較しました。
結論としては (e)を使う方が安全でした。
しかしここで一つ問題があります。
(e)ってめちゃくちゃデバッグしにくい!!
手動実行しようとすると
ReferenceError: e is not defined
これ、めっちゃある(えっ私だけ?)
なぜか!?
(e)はトリガーが実行されたときにApps Script が自動で渡すイベントオブジェクトです。
そのためエディタから手動実行すると
(e)は存在しません。 無い袖は振れないエラーです。
回答行を取得する(e.range.getRow)
JSON.stringify(e)でログをとるとこんな感じです。

大事なのはここ

e.rangeはフォーム回答が書き込まれた範囲のRangeオブジェクトです。
そして
columnEndcolumnStartrowEndrowStart
はそれぞれ
「最終列」「開始列」「最終行」「開始行」を示しています。
つまりデータはrowStart行目のcolumnStart列から
rowEnd行目のcolumnEnd列までに入っているということです。
さて、Range.getRow()は 範囲の左上セルの行番号 を返します。
つまり今回の場合は rowStart である 3 が返ります。
ところで、これなら
e.range.rowStartでも取れるやん
って思ったアナタ!
残念ながらエラーです。
あくまでこれはRangeオブジェクトをJSON化しただけなので
実際に取り出すときはRangeクラスのメソッド getRow() を使う必要があるのです。
ややこしいね。
ということで、このRange.getRow()をlastRowの代わりに使ってみましょう。
lastRowから卒業する
今までこうしていたものを
sheet.getLastRow();
こうしてみます。
e.range.getRow();
つまり、シートの最終行を取るのではなく
フォームの 該当する回答が入っている行 を取るのです。
こうすれば複数回答同時送信でも混乱なく
正しいデータを取得することができます。
データはどちらもスプレッドシートから取得するので
視覚的にもわかりやすく、初心者にやさしい!
もしシートの書き込みが遅くてエラーになる場合は
最初にUtilities.sleep(1000)を入れておくのもいいでしょう。
ちなみに、途中の行を削除しても getRow() は
実際に書き込まれた行番号 を返すので問題ありません。
手動テストとフォーム送信を分岐する
さらにこんなふうに(e)の有無で分岐すると
フォームからの送信時と、エディタからのテスト時で
取得するデータの行を分けることができます。
var form_row;
if(e){
//フォーム送信のときはフォーム回答の行
form_row = e.range.getRow();
}else{
//フォーム送信じゃないときは最終行
form_row = sheet_form.getLastRow();
}
これで
- 本番 →
e.range.getRow() - 手動テスト →
lastRow()
という形で 安全にデバッグできるようになりました!
まとめ
イベントオブジェクト (e) は便利ですが、
そのままでは手動デバッグができません。
e.range.getRow() を使えば、
フォーム回答が書き込まれた行を特定できるので、
安全にデータを取得できます。
以上、同じエラーで悩んでいる方の助けになれば幸いです。
フォーム処理では e.values や e.namedValues もよく使うので、
次回はこの違いについて整理してみます。
どっちを使う?onFormSubmit(e)の values と namedValues の違いと使い分け