今までの記事一覧
- 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 を前提にしています。
トリガーは以下を設定しています。
- スプレッドシートから
- フォーム送信時
回答取得は(e)?lastRow()?
GoogleForm回答をGASで加工してスプレッドシートに展開するとき
初心者向けの記事なんかだと、よくこんなふうに回答を取得しています。
var form_datas=sheet_form.getRange(lastRow,1,1,lastColumn).getValues();
私もずっとこれでやってきました。
ところがある日気づいたんです。
これって(e)でも取れるんじゃね?
function form_edited(e) {
Logger.log(e);
}
あとはトリガーで「スプレッドシートから」「フォーム送信時」にしてGO!

うん、何かが取れてるっぽい。
ということで今回は
フォーム回答の取得方法
- e(イベントオブジェクト)
- lastRow()でシート取得
この2つの違いを整理してみました。
objectってなんやねん
さて、何かが取れたのは良いのですが、このobjectってなに?
人間に分かる形に展開できるのでしょうか。
いろいろ調べてみるとログに出ている object は
JSON形式のオブジェクトらしい。
JSON文字列に変換すれば中身が見えそうです。
Logger.log(JSON.stringify(e));
ってことはこうすれば
function form_edited(e) {
Logger.log(JSON.stringify(e.values));
}
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);
}
(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)
というわけで次の記事では
をやってみたいと思います。
他にもGASでフォーム連携していてハマったポイントがあれば
コメントで教えてもらえると嬉しいです。


