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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

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

Q&A

1回答

1693閲覧

TypeError: Cannot read property 'namedValues' of undefined onSubmitForm が解決できない

isd_kisk

総合スコア15

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

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

0グッド

0クリップ

投稿2021/07/19 10:33

GASを使って、googleフォームから入力された情報をもとにスプレッドシートに検索をかけて、同じ情報があるかを調べるコードを書いています。

しかしながら、50行目のconst answerEmail = e.namedValues['メールアドレス'][0];において、
TypeError: Cannot read property 'namedValues' of undefined
onSubmitForm @ コード.gs:50
というエラーが出てしまいます。

今のところ、自分が行いたい作業はできているのですが、終わりの方のコメントアウトされている自動メール送信ができません。その原因は、TypeError: Cannot read property 'namedValues' of undefined onSubmitFormにあると思います。

どなたかわかる方ご教示願います。

javascript

1var ss = SpreadsheetApp.getActiveSpreadsheet(); 2 var sheet = ss.getActiveSheet(); 3 var formUrl = "https://docs.google.com/forms/d/1KMYo6U0KZKu7PDEiLld9llGGGXN_AyfZ3la58iZhOnM/" 4 var form= FormApp.openByUrl(formUrl); 5// 2行目からデータがスタート 6const ROW_DATA_START = 2; 7 8// メールアドレスはC列にある前提 9const COLUMN_EMAIL = 3; 10 11const QUESTIONS = [ 12 {sheetName: '', column: 4, title: 'タイムスタンプ'}, 13 {sheetName: '', column: 4, title: '名前'}, 14 {sheetName: '', column: 4, title: 'ふりがな'}, 15 {sheetName: '', column: 4, title: '出身県'}, 16 {sheetName: '', column: 4, title: '努力レベル [コースに対する自分の頑張り度]'}, 17 {sheetName: '', column: 4, title: '学習効果 [コース開始時におけるスキル / 知識のレベル]'}, 18 {sheetName: '', column: 4, title: '学習効果 [コース終了時におけるスキル / 知識のレベル]'}, 19 {sheetName: '', column: 4, title: '学習効果 [コースの修了に要するスキル / 知識のレベル]'}, 20 {sheetName: '', column: 4, title: '学習効果 [スキル / 知識に対するコースの効果]'}, 21 {sheetName: '', column: 4, title: '講師のスキルと対応 [講師の講義や実演は効果的だった]'}, 22 {sheetName: '', column: 4, title: '講師のスキルと対応 [プレゼンテーションはよく整理されていてわかりやすかった]'}, 23 {sheetName: '', column: 4, title: '講師のスキルと対応 [講師は生徒の興味・関心をかき立てた]'}, 24 {sheetName: '', column: 4, title: '講師のスキルと対応 [講師は授業時間を効果的に使った]'}, 25 {sheetName: '', column: 4, title: '講師のスキルと対応 [講師は質問に丁寧に対応してくれた]'}, 26 {sheetName: '', column: 4, title: '講師のスキルと対応 [採点は迅速に行われ、役に立つフィードバックが含まれていた]'}, 27 {sheetName: '受講者事前情報', column: 5, title: 'コースの内容 [学習目標が明確に設定されていた]'}, 28 {sheetName: '受講者事前情報', column: 6, title: 'コースの内容 [コースの内容はよく整理、計画されていた]'}, 29 {sheetName: '受講者事前情報', column: 7, title: 'コースの内容 [コースの学習量は適切だった]'}, 30 {sheetName: '受講者事前情報', column: 8, title: 'コースの内容 [コースは生徒全員が十分に参加できる構成になっていた]'}, 31 {sheetName: '受講者情報', column: 5, title: 'このコースのどのような点が特に役立ちましたか。'}, 32 {sheetName: '受講者情報', column: 6, title: 'このコースのどのような点を改善した方がよいと思いますか。'}, 33 {sheetName: '受講者情報', column: 7, title: 'このコースを選んだ理由は何ですか。'} 34] 35 36// スプレッドシートURLのリスト 37const SPREASHEET_URLS = [ 38 'https://docs.google.com/spreadsheets/d/10PRCSoBM0vvFqDDs-ae7n9akDs-rwTmNm8z1A6z-5FE/edit?ts=60f525bc#gid=0', 39 'https://docs.google.com/spreadsheets/d/10PRCSoBM0vvFqDDs-ae7n9akDs-rwTmNm8z1A6z-5FE/edit?ts=60f525bc#gid=0' 40] 41 42 43/** 44 * フォーム回答時 45 * @param {Object} e フォーム回答結果 46 */ 47function onSubmitForm(e) { 48 // console.log(e.namedValues); 49 // 回答者のメールアドレスを取得 50 const answerEmail = e.namedValues['メールアドレス'][0]; 51 52 // 回答者のアドレスを持ったスプレッドシートを取得 53 const spreadsheet = getTargetSpreadsheet(answerEmail); 54 55 for (let question of QUESTIONS) { 56 // 回答の出力先を取得 57 const column = question.column; 58 const sheetName = question.sheetName; 59 if (sheetName === '') continue; 60 61 // 回答結果を取得 62 const title = question.title; 63 const answer = e.namedValues[title][0]; 64 //回答者の名前を取得する 65 const name = e.values[1]; 66 67 // 設問に対応したシートを開く 68 const sheet = spreadsheet.getSheetByName(sheetName); 69 70 // シート内のすべての入力内容を2次元配列で取得 71 const values = sheet.getDataRange().getValues(); 72 73 // 1行ずつみていく 74 for (let row = ROW_DATA_START; row <= values.length; row++) { 75 // 1行分のデータ 76 const value = values[row - 1]; 77 78 // C列のメールアドレスを取得 79 const email = value[COLUMN_EMAIL - 1]; 80 81 // 回答者のメールアドレスと一致していた場合 82 if (email === answerEmail) { 83 // columnに指定した列に回答結果を書き込む 84 sheet.getRange(row, column).setValue(answer); 85 break; 86 // }else{ 87 // //名前がなかった時の送信先を指定 88 // let recipient = "hoge@gmail.com" 89 90 // //メールのタイトルを指定 91 // const subject = "認識されないメールアドレス" 92 // //メールの本文 93 // const body = "${name}様からアンケートが回答されました。" 94 // //フォームから名前を取得 95 // GmailApp.sendEmail(recipient, subject, body); 96 // } 97 } 98 } 99} 100 101/** 102 * 対象のスプレッドシートを取得 103 * @param {String} answerEmail 回答者のメールアドレス 104 * @return {Spreadsheet} 回答者のアドレスが登録されているスプレッドシート 105 */ 106function getTargetSpreadsheet(answerEmail) { 107 // スプレッドシートURLを1つずつみていく 108 for (let spreadsheetUrl of SPREASHEET_URLS) { 109 110 // スプレッドシートをひらく 111 const spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl); 112 113 // 「受講者情報」シートを取得 114 const sheet = spreadsheet.getSheetByName('受講者情報'); 115 116 // C列に対象者のメールアドレスを持ったデータがあればそのスプレッドシートが対象 117 const values = sheet.getDataRange().getValues(); 118 for (let row = ROW_DATA_START; row <= values.length; row++) { 119 const value = values[row - 1]; 120 const email = value[COLUMN_EMAIL - 1]; 121 if (email === answerEmail) { 122 return spreadsheet; 123 } 124 } 125 } 126 return null; 127} 128} 129

トリガー
実行する関数を選択→onsubmitform
デプロイ時に実行→Head
イベントのソースを選択→スプレッドシートから
イベントの種類を選択→フォーム送信時
エラー通知設定→今すぐ通知を受け取る

トリガーに問題があるのでしょうか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/19 11:31 編集

https://teratail.com/questions/256202https://www.google.com/amp/s/www.teradas.net/archives/23113/%3famp=1 に記載と同様の事象(複数GoogleアカウントでGoogleFormやAppsScriptを編集している際、 知らない間にForm作成者の実行権限がなくなってしまい、引数eにスプレッドシートの内容が入っていないまま トリガーに設定した関数が実行される)が生じている可能性があります。 https://www.google.com/amp/s/www.teradas.net/archives/23113/%3famp=1 に記載の手順で権限を設定し直すか、 https://teratail.com/questions/256202 の一番下に記載されているmarketing氏の回答のように、 (面倒かもしれませんが)フォーム、スクリプトを1から作り直した場合はどうでしょうか?
guest

回答1

0

'namedValues'というプロパティが存在しない、と言ってるんですから、
そのeになにが入ってるのか確認してみては。
なにが入っている想定なんでしょうか。

投稿2021/07/19 10:50

y_waiwai

総合スコア88042

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

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

isd_kisk

2021/07/20 01:22

eにはフォームの回答結果がある想定です
y_waiwai

2021/07/20 01:25

そいつの型はなんでしょう。そして、それにはnamedValuesがあるんですよね? で、実際に走らせたとき、そいつにはなにが入ってきたんでしょうか
isd_kisk

2021/07/20 01:32

undefinedとなっています。なぜ、undefinedとなっている理由は何なのでしょうか
y_waiwai

2021/07/20 01:37

その関数を呼んでいるところでなんかおかしいことが起こってるってことですね 引数の指定はどうなってるでしょうか
isd_kisk

2021/07/20 02:02

すいません。引数の指定はどこで見ればいいのでしょうか? e:undefined answeremail:undefined spreadsheet:undefined となっています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問