実現したいこと
Google formでの回答に対して, 確認メッセージ(もしくはそれに対する自動送信)に対して通し番号を振りたい.スプレッドシートにもその通し番号を入力したい
発生している問題・分からないこと
Google Apps Scriptで実装してみてもうまくいきません.
ネットで検索して参考になりそうなもので試してみても, onFormSubmit関数が実行されてもエラーとなります.
シート名を"立替申請"に訂正すると, スプレッドシートの通し番号は振られました
スプレッドシートのGASに全て入力していました.
フォーム・スプレッドシートにそれぞれどのようにGASを記載すれば良いのでしょうか?
2025/07/10 22:16:19 エラー TypeError: Cannot read properties of undefined (reading 'getEditResponseUrl')
at onFormSubmit(コード:29:30)
該当のソースコード
const SHEET_NAME_CLAIM = "立替申請"; const ACCOUNTING_EMAIL = "******"; // 会計担当 // 年度(4月始まり) function getFiscalYear(date) { const y = date.getFullYear(); const m = date.getMonth() + 1; return m >= 4 ? y : y - 1; } function onFormSubmit(e) { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("立替申請"); const lastRow = sheet.getLastRow(); // 通し番号生成(I列 = 9) const fiscalYear = getFiscalYear(new Date()); const serialCol = 9; const serialData = sheet.getRange(2, serialCol, lastRow - 1).getValues().flat(); const count = serialData.filter(v => typeof v === 'string' && v.startsWith(`${fiscalYear}-`)).length + 1; const serialNumber = `${fiscalYear}-${String(count).padStart(4, '0')}`; sheet.getRange(lastRow, serialCol).setValue(serialNumber); // メール送信内容 const row = sheet.getRange(lastRow, 1, 1, sheet.getLastColumn()).getValues()[0]; const name = row[3]; // D列 const description = row[6]; // G列 const amount = row[7]; // H列 const email = row[2]; // C列 const editUrl = e.response.getEditResponseUrl(); // 本人への通知 const body = `${name} 様\n\n「${description}」について\n${amount}円で申請が行われました。\n\n通し番号:${serialNumber}\n訂正はこちら:\n${editUrl}\n\n受領報告フォーム:\nhttps://〜`; GmailApp.sendEmail(email, `【申請受付】${serialNumber}`, body); // 会計担当へ通知 const accountingEmail = "***********"; const accBody = `${name} 様より\n通し番号:${serialNumber}\n「${description}」\n${amount}円の申請がありました。`; GmailApp.sendEmail(accountingEmail, `【会計通知】${serialNumber}`, accBody); }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
採番管理やこれに似たものは検索してやってみましたが、スプレッドへの入力が適当でなかったりします.
補足
特になし
うまくいかないというのは何がうまく行っていないのでしょうか?
・onFormSubmit自体が実行されていない
・実行はされるがエラーが出る
・実行はされているが通し番号が意図していないものになっている
などもう少し詳細があるといいかもしれません。
実行はされるがエラーが出て, 通し番号の生成も確認メッセージなどへの番号の表示もされません.
エラーが出ているのであれば発生しているエラーメッセージをコピペで記載してください。
エラーメッセージはコメント欄ではなく質問を編集して記載のほうがいいと思います。
エラーが出て正常動作していないとのことですが、このエラーとは関係なく根本の処理としての注意点です。
フォーム確認メッセージへの更新は今回答えた人へ表示されるのではなく次の人に表示されるものとなります。
コードを見ると「フォーム確認メッセージ」と「通知メール」に同じ通し番号を設定しています。
この状態ですと通し番号がずれるので注意してください。
Aさんが回答した場合
通し番号が001となったとしたら
Aさんが回答後に表示されるフォーム確認メッセージは「000」と表示された後
フォーム確認メッセージが「001」となる(これは表示されない)
その後、メール送信で「Aさん」が「001」の通し番号のメールとして送信される
次にBさんが回答した場合
Bさんが回答後に表示されるフォーム確認メッセージは「001」と表示された後
フォーム確認メッセージが「002」となる(これは表示されない)
その後、メール送信で「Bさん」が「002」の通し番号のメールとして送信される
といった動作になります。
このコードは、スプレッドシート、フォームのいずれのエディタに保存していますか?
スプレッドシートならe.responseは取得できませんし
フォームならe.rangeやe.namedValuesは取得できません
トリガーとイベントオブジェクトとの関係を確認してみてください
--
const row = e.range.getRow();
--
const responseUrl = e.response.getEditResponseUrl();
--
const formData = e.namedValues;
最終行を取得しようとしているシート(おそらくフォームの回答が記入されているシート)の名前は 立替申請 になっていますか?
スプレッドシートのトリガーではeditUrlは取得できないので
例えばですが…
トリガーでシートから取得した回答レコードのA列のタイムスタンプを
別途FormAppからフォームを開いてresponsesを取得し
反復処理 for (const response of responses) {}で
responseから取得したタイムスタンプと比較して
概ね2~3秒以内に含まれていれば一致すると判定(※)し、
そのresponseからeditUrlを取得することができるか
試してみるというのはいかがでしょうか
※タイムスタンプは秒単位では一致しないこともあるようなので
現状のスクリプトをスプレッドシートではなくフォームのほうに書いてトリガー設定したほうがいいような気がします。
Excelの回答レコードに通し番号を記録しなくていいなら…

あなたの回答
tips
プレビュー