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
イベントのソースを選択→スプレッドシートから
イベントの種類を選択→フォーム送信時
エラー通知設定→今すぐ通知を受け取る
トリガーに問題があるのでしょうか?