質問するログイン新規登録
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

440閲覧

Google formで確認メッセージに通し番号をつけたい

hara_0129

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2025/07/07 06:18

編集2025/07/10 13:25

0

0

実現したいこと

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等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

採番管理やこれに似たものは検索してやってみましたが、スプレッドへの入力が適当でなかったりします.

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bebebe_

2025/07/07 06:38

うまくいかないというのは何がうまく行っていないのでしょうか? ・onFormSubmit自体が実行されていない ・実行はされるがエラーが出る ・実行はされているが通し番号が意図していないものになっている などもう少し詳細があるといいかもしれません。
hara_0129

2025/07/07 07:09

実行はされるがエラーが出て, 通し番号の生成も確認メッセージなどへの番号の表示もされません.
bebebe_

2025/07/07 07:33

エラーが出ているのであれば発生しているエラーメッセージをコピペで記載してください。 エラーメッセージはコメント欄ではなく質問を編集して記載のほうがいいと思います。
YAmaGNZ

2025/07/07 08:33 編集

エラーが出て正常動作していないとのことですが、このエラーとは関係なく根本の処理としての注意点です。 フォーム確認メッセージへの更新は今回答えた人へ表示されるのではなく次の人に表示されるものとなります。 コードを見ると「フォーム確認メッセージ」と「通知メール」に同じ通し番号を設定しています。 この状態ですと通し番号がずれるので注意してください。 Aさんが回答した場合 通し番号が001となったとしたら Aさんが回答後に表示されるフォーム確認メッセージは「000」と表示された後 フォーム確認メッセージが「001」となる(これは表示されない) その後、メール送信で「Aさん」が「001」の通し番号のメールとして送信される 次にBさんが回答した場合 Bさんが回答後に表示されるフォーム確認メッセージは「001」と表示された後 フォーム確認メッセージが「002」となる(これは表示されない) その後、メール送信で「Bさん」が「002」の通し番号のメールとして送信される といった動作になります。
YellowGreen

2025/07/08 00:24

このコードは、スプレッドシート、フォームのいずれのエディタに保存していますか? スプレッドシートならe.responseは取得できませんし フォームならe.rangeやe.namedValuesは取得できません トリガーとイベントオブジェクトとの関係を確認してみてください -- const row = e.range.getRow(); -- const responseUrl = e.response.getEditResponseUrl(); -- const formData = e.namedValues;
bebebe_

2025/07/10 00:34

最終行を取得しようとしているシート(おそらくフォームの回答が記入されているシート)の名前は 立替申請 になっていますか?
YellowGreen

2025/07/11 08:24

スプレッドシートのトリガーではeditUrlは取得できないので 例えばですが… トリガーでシートから取得した回答レコードのA列のタイムスタンプを 別途FormAppからフォームを開いてresponsesを取得し 反復処理 for (const response of responses) {}で responseから取得したタイムスタンプと比較して 概ね2~3秒以内に含まれていれば一致すると判定(※)し、 そのresponseからeditUrlを取得することができるか 試してみるというのはいかがでしょうか ※タイムスタンプは秒単位では一致しないこともあるようなので
YAmaGNZ

2025/07/11 11:36

現状のスクリプトをスプレッドシートではなくフォームのほうに書いてトリガー設定したほうがいいような気がします。
YellowGreen

2025/07/12 01:48

Excelの回答レコードに通し番号を記録しなくていいなら…
guest

回答1

0

自己解決

youtubeを参考にさせていたきました.
リンク内容
リンク内容
スプレッドシートのGASで事足りました
/**

  • 申請番号を埋め込み
    */
    function OnFormSubmit(e) {

const range = e.range
const sh = range.getSheet()
const form = FormApp.openByUrl(sh.getFormUrl())

const row = range.getRow()

//受付番号の採番
let recno = row

//受付番号をシートに記載
sh.getRange(row, 9).setValue(recno)

// let msg = form.getConfirmationMessage()
//次の申請番号を作成しておく
recno = row + 1

let msg = 申請番号: ${recno} レシート等にこの申請番号を書いて**に提出してください. また, 受領報告の際にも番号は使います. スクリーンショットやメモをしておいてください.

console.log(msg)

// msg = msg.replace("%recno%", recno)

form.setConfirmationMessage(msg)
}

function sendEmail(e) {

//回答データを取得
var values = e.values;
var name = values[4];
var content = values[6];
var price = values[7];
var receipt = values[8]
//送信アドレス、件名、本文を宣言
var recipient = "****";//本来はアドレス
var subject = '立替申請がありました.'
var body =
1.お名前:${name} 2.内容:${content} 3.金額:${price} 4.レシート:${receipt};
//メール送信
GmailApp.sendEmail(recipient, subject, body);

}

投稿2025/07/30 12:58

hara_0129

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2025/07/30 13:17

同時に回答したらどうなるんですかね?
hara_0129

2025/07/30 14:01

想定していなかったですね… 秒より細かいところも反映されるようですがそれすら重なることもありますからね. 同時入力起こる可能性もありますが、あまり想像したくないですね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問