質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

1回答

3719閲覧

e undefined の原因

high_rose

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2021/10/15 15:02

前提・実現したいこと

GASを勉強し始めて3日程の初心者です。

https://tonari-it.com/gas-workflow-form-gmail-spreadsheet/
を参考に勤務時間の申請や承認をGASを使ってできないか、見よう見まねで勉強させていただいています。
というかほぼ丸パクリです。

申告者はgoogle formにて勤務に関する情報を送信。
フォームに記入されたことをトリガーとして承認者へ"GmailApp.SendEmail"でGmailを送る。
メール受信者は添付のURLをクリックすると"doGet"でメールを返すとともにスプシ上でも承認を出す。

発生している問題・エラーメッセージ

2つのfunction でいずれも e undefined と出てきてしまいます。
スプシ上にはフォームの回答結果が記載されているので以下のコードでなぜundefined なのか分かりません。

また承認の決済を出すためにURLを踏みますが、
TypeError:Cannnot read property 'getRange' of null(行32、ファイル「コード」)
とも出てきてしまいます。
ソースコードはほぼコピー同然なのに何がいけないのでしょうか?
余計なコードもあるかと思いますがよろしくお願いします。

該当のソースコード

//フォーム送信時にメール自動配信 function sendMessage(e){ const [timeStamp, email, worker, workday, B_startTime, B_endTime, location, comment]=e.values; const row = e.range.getRow(); const sheet = e.range.getSheet(); sheet.getRange(row,9).setValue("確認中"); const recipient = "address@~"; const subject = "勤務時間の申告・申請のお知らせ"; let body = ""; body +="勤務時間に係る申告・申請がありました。\n\n"; body +="申請者:" + worker; body +="\n勤務日:"+ workday; body +="\n勤務開始時間:"+ B_startTime; body +="\n勤務終了時間:"+ B_endTime; body +="\n勤務場所:"+ location; body +="\nコメント:"+ comment; body +="\n\n承認する場合は、以下のURLをクリックしてください。\n"; body +="https://script.google.com/URL"; body +="?row=" + row +"行目"; GmailApp.sendEmail(recipient,subject,body); } //ウェブアプリケーションとして公開 function doGet(e){ const row = e.parameter.row;//関数rowは回答に対応する行番号 const sheet = SpreadsheetApp.getActiveSheet();//現在開いているアクティブなスプシを取得 const values = sheet.getRange(row, 1,1,9).getValues()[0]; const [timeStamp, email, worker, workday, B_startTime, B_endTime, location, comment] = values; sheet.getRange(row,9).setValue("承認"); //承認メールを申請者へ送信 const subject = "勤務時間の申告・申請のお知らせ" let body = ""; body += "以下の勤務時間の申告・申請が承認されました。"; body +="申請者:" + worker; body +="\n勤務日:"+ workday; body +="\n勤務開始時間:"+ B_startTime; body +="\n勤務終了時間:"+ B_endTime; body +="\n勤務場所:"+ location; body +="\nコメント:"+ comment; GmailApp.sendEmail(email,subject,body);//申請者にメールを送る let html = ""; html += "<h1>勤務時間申告・申請のお知らせ</h1>"; html += "<p>あなたは勤務時間申告・申請を承認しました。</p>"; html += "<ul>"; html += "<li>申請者: + worker</li>"; html += "<li>勤務日: + workday</li>"; html += "<li>勤務開始時間: + B_startTime</li>"; html += "<li>勤務終了時間: + B_endTime</li>"; html += "<li>勤務場所: + location</li>"; html += "</ul>"; return HtmlService.createHtmlOutput(html); }

試したこと

トリガーの設定は、
sendMessage : Head フォーム送信時
doGet : Head 起動時
にしています。

まだ右も左も分からないので引数(e)が両方のfunctionで使われているからか等も考え色々試しましたが見当違いだったようです。

補足情報(FW/ツールのバージョンなど)

以上です。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

sendMessage をスクリプトエディタから実行しているから、だと思います。
実際に、フォームを回答して試す必要があります。

また承認の決済を出すためにURLを踏みますが、

とのことですが sendMessage がエラーになっているということは、sendMessage で生成した URL をクリックできていないはずです。
なので、url が正しくないので doGet もエラーになります。

エラーが出ているはずなのに、"TypeError:Cannnot read property 'getRange' of null(行32、ファイル「コード」)"となるのは奇妙ですね。
32 行目は↓だと思いますが、アクティブなシート(下記の sheet )を正常に読み込めていないことを示すエラーですが、そもそも doGet で ActiveSheet が取れるのかが疑わしい気もしました(ただ、できると言ってるのでできるのでしょうね)

const values = sheet.getRange(row, 1,1,9).getValues()[0];

試してないので何ともですが、

const sheet = SpreadsheetApp.getActiveSheet();//現在開いているアクティブなスプシを取得

を↓な感じにしてみてもいいかもです。

javascript

1const sheet = SpreadsheetApp.getActive().getSheetByName("フォームの回答");

投稿2021/10/15 18:00

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問