1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GAS】onFormSubmit(e)を手動実行でデバッグする方法

1
Last updated at Posted at 2026-03-10

今までの記事一覧

  1. GASでGoogleForm回答を取得するなら lastRow?(e)?試してみた
  2. onFormSubmit(e)を手動実行でデバッグする方法  <この記事
  3. どっちを使う?onFormSubmit(e)の values と namedValues の違いと使い分け
  4. onFormSubmit(e) の e.values 配列順のしくみ
  5. Googleフォームで質問を変えても壊れない!cleanFormData(e)でnamedValues防御力をアップ 
  6. Googleフォームの質問変更に負けない!「部分一致」と「秘密の暗号」でcleanFormData(e)の防御力を鉄壁に
  7. 手動コピペはもう卒業!Googleフォームの回答別に処理を自動仕分け
  8. Googleフォームで同時に大量送信されても踏ん張る!LockServiceで順番制御!try - catch - finally でバトンを繋げ!
  9. LockServiceでは順番は守れない?受付番号で順序を保証する方法

前提

この記事は、フォーム回答を保存している スプレッドシート側のGAS を前提にしています。
トリガーは以下を設定しています。

  • スプレッドシートから
  • フォーム送信時

前回の記事では、GoogleFormの回答取得方法として

  • lastRow
  • (e)

を比較しました。
結論としては (e)を使う方が安全でした。

しかしここで一つ問題があります。

(e)ってめちゃくちゃデバッグしにくい!!

手動実行しようとすると
ReferenceError: e is not defined
これ、めっちゃある(えっ私だけ?)

なぜか!?

(e)はトリガーが実行されたときにApps Script が自動で渡すイベントオブジェクトです。
そのためエディタから手動実行すると
(e)は存在しません。 無い袖は振れないエラーです。

回答行を取得する(e.range.getRow)

JSON.stringify(e)でログをとるとこんな感じです。
image.png
大事なのはここ
image.png
e.rangeはフォーム回答が書き込まれた範囲のRangeオブジェクトです。
そして

  • columnEnd
  • columnStart
  • rowEnd
  • rowStart

はそれぞれ
「最終列」「開始列」「最終行」「開始行」を示しています。
つまりデータは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.valuese.namedValues もよく使うので、
次回はこの違いについて整理してみます。
どっちを使う?onFormSubmit(e)の values と namedValues の違いと使い分け

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?