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

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

Q&A

解決済

2回答

471閲覧

フォームで回答した内容に応じてスプレッドシートを自動で更新したい

fujikana

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2023/06/26 01:57

0

0

実現したいこと

フォームID
Ph2v_kDOiVcOPx-i-GdXon-8V84T0e8JJpHVEc92-Gk

上記のフォームにて「氏名」を選択(id:983843813)し、「連絡先」(ID:1590350412)を入力して回答を送信した時に
スプレッドシートID「1Jtu1kpdoTagSijaN5oSlfq1G-q4rD3dv44PRfC2542M」のシート「社員DB」のB列の氏名と、フォームで回答した氏名が一致するした場合、B列と同じ行のG列に回答を反映させたいのですが、うまくいきません。

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

TypeError: Cannot read properties of undefined (reading 'response')
onFormSubmit @ 無題.gs:11

該当のソースコード

function onFormSubmit(e) {
// フォームIDと質問ID
var nameQuestionId = '983843813';
var responseQuestionId = '1590350412';

// スプレッドシートのIDと対象列のインデックス
var spreadsheetId = '1Jtu1kpdoTagSijaN5oSlfq1G-q4rD3dv44PRfC2542M';
var nameColumnIndex = 2; // B列
var responseColumnIndex = 7; // G列

var itemResponses = e.response.getItemResponses();
var responseAnswer = '';
var nameAnswer = '';

for (var i = 0; i < itemResponses.length; i++) {
var itemResponse = itemResponses[i];
if (itemResponse.getItem().getId() === responseQuestionId) {
responseAnswer = itemResponse.getResponse();
} else if (itemResponse.getItem().getId() === nameQuestionId) {
nameAnswer = itemResponse.getResponse();
}
}

var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
var sheet = spreadsheet.getSheetByName('社員DB');
var rowIndex = getRowIndexByName(sheet, nameAnswer, nameColumnIndex);

if (rowIndex != -1) {
sheet.getRange(rowIndex, responseColumnIndex).setValue(responseAnswer);
}
}

function getRowIndexByName(sheet, name, column) {
var dataRange = sheet.getRange(1, column, sheet.getLastRow(), 1);
var data = dataRange.getValues();
for (var i = 0; i < data.length; i++) {
if (data[i][0] === name) {
return i + 1;
}
}
return -1;
}

試したこと

ChatGPTで色々と質問をしてみたのですが、一向に解決しません。
ぜひお力添えをお願いしたく存じます。トリガー「onFormSubmit」「createTrigger」のエラーは0%です。

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

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

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

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

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

YellowGreen

2023/06/26 03:01

ご提示のスクリプトで、 var nameQuestionId = '983843813'; var responseQuestionId = '1590350412'; を var nameQuestionId = 983843813; var responseQuestionId = 1590350412; とするか または、 if (itemResponse.getItem().getId() === responseQuestionId) { ... } else if (itemResponse.getItem().getId() === nameQuestionId) { を if (itemResponse.getItem().getId() == responseQuestionId) { ... } else if (itemResponse.getItem().getId() == nameQuestionId) { とするとどうなりますか?
YellowGreen

2023/06/26 03:06

それから、試すときは、フォームから回答を送信してください。 エディタから実行すると必ずエラーになります。
fujikana

2023/06/26 03:23

無事解決いたしました、お忙しい中ありがとうございました!
guest

回答2

0

自己解決

早速の回答ありがとうございます。
ご指摘の通り修正をかけてフォームの送信をしてみたのですが、「onFormSubmit:50%」とエラーが出ており、
コードでは
TypeError: Cannot read properties of undefined (reading 'namedValues')
onFormSubmit @ 無題.gs:11

というエラーが出ております。

投稿2023/06/26 03:23

fujikana

総合スコア1

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

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

0

この回答はGPT-4による自動生成回答です

e.response ではなく、e.namedValues を使用して回答を取得することで、エラーを解決できると思います。以下のコードを試してみてください。

javascript

1function onFormSubmit(e) { 2 // フォームIDと質問ID 3 var nameQuestionId = '氏名'; 4 var responseQuestionId = '連絡先'; 5 6 // スプレッドシートのIDと対象列のインデックス 7 var spreadsheetId = '1Jtu1kpdoTagSijaN5oSlfq1G-q4rD3dv44PRfC2542M'; 8 var nameColumnIndex = 2; // B列 9 var responseColumnIndex = 7; // G列 10 11 var namedValues = e.namedValues; 12 var responseAnswer = namedValues[responseQuestionId][0]; 13 var nameAnswer = namedValues[nameQuestionId][0]; 14 15 var spreadsheet = SpreadsheetApp.openById(spreadsheetId); 16 var sheet = spreadsheet.getSheetByName('社員DB'); 17 var rowIndex = getRowIndexByName(sheet, nameAnswer, nameColumnIndex); 18 19 if (rowIndex != -1) { 20 sheet.getRange(rowIndex, responseColumnIndex).setValue(responseAnswer); 21 } 22} 23 24function getRowIndexByName(sheet, name, column) { 25 var dataRange = sheet.getRange(1, column, sheet.getLastRow(), 1); 26 var data = dataRange.getValues(); 27 for (var i = 0; i < data.length; i++) { 28 if (data[i][0] === name) { 29 return i + 1; 30 } 31 } 32 return -1; 33}

このコードでは、e.namedValues を使用して回答を取得し、質問IDではなく質問タイトル(氏名、連絡先)を使用しています。これにより、エラーが解決されるはずです。

投稿2023/06/26 01:57

teratail-ai

Powered by GPT-4

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

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

fujikana

2023/06/26 02:27

早速の回答ありがとうございます。 ご指摘の通り修正をかけてフォームの送信をしてみたのですが、「onFormSubmit:50%」とエラーが出ており、 コードでは TypeError: Cannot read properties of undefined (reading 'namedValues') onFormSubmit @ 無題.gs:11 というエラーが出ております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問