0
1

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】GoogleFormの回答を取得するなら lastRow?(e)?試してみた

0
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 を前提にしています。
トリガーは以下を設定しています。

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

回答取得は(e)?lastRow()?

GoogleForm回答をGASで加工してスプレッドシートに展開するとき
初心者向けの記事なんかだと、よくこんなふうに回答を取得しています。

var form_datas=sheet_form.getRange(lastRow,1,1,lastColumn).getValues();

私もずっとこれでやってきました。
ところがある日気づいたんです。

これって(e)でも取れるんじゃね?

function form_edited(e) {
  Logger.log(e);
}

あとはトリガーで「スプレッドシートから」「フォーム送信時」にしてGO!
image.png
うん、何かが取れてるっぽい。

ということで今回は

フォーム回答の取得方法

  • e(イベントオブジェクト)
  • lastRow()でシート取得
    この2つの違いを整理してみました。

objectってなんやねん

さて、何かが取れたのは良いのですが、このobjectってなに?
人間に分かる形に展開できるのでしょうか。

いろいろ調べてみるとログに出ている object は
JSON形式のオブジェクトらしい。
JSON文字列に変換すれば中身が見えそうです。

Logger.log(JSON.stringify(e));

image.png
おお!いい感じじゃないっすか?

ってことはこうすれば

function form_edited(e) {
  Logger.log(JSON.stringify(e.values));
}

image.png
いいね!
無事、1次元配列でデータが取得できました。

lastRowのデータはどうなってる?

ではここで、スプレッドシートの最終行からのデータを取ってみましょう。

function getLastRow(){
  const form_sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォームの回答 1");
  var lastRow=form_sheet.getLastRow();
  var lastColumn=form_sheet.getLastColumn();
  var data=form_sheet.getRange(lastRow,1,1,lastColumn).getValues();
  Logger.log(data);
}

image.png

(e)で取得したデータと比較すると、次の違いがありました。

  • 日時の形式
  • 1次元配列 or 2次元配列

ここまで見るとこう思いません?

じゃあ、lastRowで良くね?

だって、(e)ってテストするときいちいちフォーム送信しないといけないし
1行ずつのデバックもできないし、めっちゃ不便じゃん。

lastRowなら普通の関数として実行できるのでテスト簡単。
スプレッドシートで見えてるデータを使うので初心者でも分かりやすい。

しかし、これにはちょっとしたリスクがあります。

lastRowの落とし穴

勘の良い方ならお気づきかもしれませんが
複数のフォーム送信がほぼ同時にされた場合、
lastRowが別の回答を指す可能性があります。
つまり、間違ったデータを取得してしまいます。

あと、実際に私が経験した例では
送信内容がスプレッドシートに書き込まれる前にGASが動いて
1つ前のデータを取得した、とか。

結論:やっぱ(e)を使ったほうが安全

Google公式ドキュメントでも
トリガーが起動すると

イベントオブジェクト e が関数に渡される

と説明されています。

例として onEdit(e) が紹介されていますが、
フォーム送信トリガーでも同じように e が渡されます。
https://developers.google.com/apps-script/guides/triggers/events?hl=ja


でもね、そうはいってもやっぱり使いづらいよね、(e)
というわけで次の記事では

デバッグOK!(e)の弱点克服

をやってみたいと思います。


他にもGASでフォーム連携していてハマったポイントがあれば
コメントで教えてもらえると嬉しいです。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?