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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google フォーム

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

Google Apps Script

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

Q&A

解決済

1回答

1340閲覧

Google Apps Scriptで代入を51回以上行うとエラーが出て困っています。

88yasu

総合スコア13

Google フォーム

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/11/03 06:10

編集2020/11/03 07:41

ページを見て下さってありがとうございます。
教えて頂ける方がいらっしゃるとありがたいです。

・行いたいこと

google formsでアンケートを集計して、Google Apps Scriptでアンケート結果に基づく得点を自動で計算するというプログラムを書きたいです。
アンケートでは54問全ての問題で「0. いいえ」「1. どちらでもない」「2. はい」のいずれかを選んで頂くというものです。
先頭の文字だけに抽出して0, 1, 2のいずれかのデータをbのx番目のデータという形で数値化して因子(項目)別で足し算をして、回答者毎の新たなセルに書き出したいと考えています。

Google formsのスプレッドシードのスクリプトエディタの本文に記載したコードは以下の通りです(正確にはこの回答結果をアンケート回答者のメールに送信するため多少異なる部分がございます)。

google

1function sendMessage(e) { 2 3const [timeStamp, email, id, name, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54] = e.values; 4 5b1 = a1.slice(0,1) 6b2 = a2.slice(0,1) 7b3 = a3.slice(0,1) 8b4 = a4.slice(0,1) 9b5 = a5.slice(0,1) 10b6 = a6.slice(0,1) 11b7 = a7.slice(0,1) 12b8 = a8.slice(0,1) 13b9 = a9.slice(0,1) 14b10 = a10.slice(0,1) 15b11 = a11.slice(0,1) 16b12 = a12.slice(0,1) 17b13 = a13.slice(0,1) 18b14 = a14.slice(0,1) 19b15 = a15.slice(0,1) 20b16 = a16.slice(0,1) 21b17 = a17.slice(0,1) 22b18 = a18.slice(0,1) 23b19 = a19.slice(0,1) 24b20 = a20.slice(0,1) 25b21 = a21.slice(0,1) 26b22 = a22.slice(0,1) 27b23 = a23.slice(0,1) 28b24 = a24.slice(0,1) 29b25 = a25.slice(0,1) 30b26 = a26.slice(0,1) 31b27 = a27.slice(0,1) 32b28 = a28.slice(0,1) 33b29 = a29.slice(0,1) 34b30 = a30.slice(0,1) 35b31 = a31.slice(0,1) 36b32 = a32.slice(0,1) 37b33 = a33.slice(0,1) 38b34 = a34.slice(0,1) 39b35 = a35.slice(0,1) 40b36 = a36.slice(0,1) 41b37 = a37.slice(0,1) 42b38 = a38.slice(0,1) 43b39 = a39.slice(0,1) 44b40 = a40.slice(0,1) 45b41 = a41.slice(0,1) 46b42 = a42.slice(0,1) 47b43 = a43.slice(0,1) 48b44 = a44.slice(0,1) 49b45 = a45.slice(0,1) 50b46 = a46.slice(0,1) 51b47 = a47.slice(0,1) 52b48 = a48.slice(0,1) 53b49 = a49.slice(0,1) 54b50 = a50.slice(0,1) 55b51 = a51.slice(0,1) 56b52 = a52.slice(0,1) 57b53 = a53.slice(0,1) 58b54 = a54.slice(0,1) 59 60range = e.range; 61p1 = range.getRow(); 62sheet = SpreadsheetApp.getActiveSheet() 63sheet.getRange(p1, 60).setValue(parseInt(b1) + parseInt(b7)+ parseInt(b13)+ parseInt(b19)+ parseInt(b25)+ parseInt(b31)+ parseInt(b37)+ parseInt(b43)+ parseInt(b49)).getValue(); 64sheet.getRange(p1, 61).setValue(parseInt(b2) + parseInt(b8)+ parseInt(b14)+ parseInt(b20)+ parseInt(b26)+ parseInt(b32)+ parseInt(b38)+ parseInt(b44)+ parseInt(b50)).getValue(); 65sheet.getRange(p1, 62).setValue(parseInt(b3) + parseInt(b9)+ parseInt(b15)+ parseInt(b21)+ parseInt(b27)+ parseInt(b33)+ parseInt(b39)+ parseInt(b45)+ parseInt(b51)).getValue(); 66sheet.getRange(p1, 63).setValue(parseInt(b4) + parseInt(b10)+ parseInt(b16)+ parseInt(b22)+ parseInt(b28)+ parseInt(b34)+ parseInt(b40)+ parseInt(b46)+ parseInt(b52)).getValue(); 67sheet.getRange(p1, 64).setValue(parseInt(b5) + parseInt(b11)+ parseInt(b17)+ parseInt(b23)+ parseInt(b29)+ parseInt(b35)+ parseInt(b41)+ parseInt(b47)+ parseInt(b53)).getValue(); 68sheet.getRange(p1, 65).setValue(parseInt(b6) + parseInt(b12)+ parseInt(b18)+ parseInt(b24)+ parseInt(b30)+ parseInt(b36)+ parseInt(b42)+ parseInt(b48)+ parseInt(b54)).getValue(); 69} 70

問題が発生する条件

トリガーを設定して、実際にアンケートを入力してみると以下のようなエラーが出て処理が出来なくなります。
TypeError: Cannot read property 'slice' of undefined
at sendMessage(コード:58:17)

58番目のコードは
b54 = a54.slice(0,1)
です。

試してみたこと

質問12個の同様のアンケートでは既に動くプログラムが作成できています。
今回、数を増やしたらエラーが出たため、コードの数を減らしうて行きました。
この結果、代入を50個(b50 = a50.slice(0,1)まで)にするとデータを読み込むことを確認しました。

この結果から、代入の最大数は50個なのかと思い、for文で処理を試みましたが、今度はfor文章の書き方が分からないという状況です。
for (var i = 1; i < 54; i++) {"b"+[i] = "a"+[i]+".slice(0,1)"}

どうすれば改善できるのか、教えて頂くことは出来ませんでしょうか。
よろしくお願いいたします。

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

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

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

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

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

dodox86

2020/11/03 06:21 編集

全体のコードが分からないので確認程度のコメントです: > b1 = a1.slice(0,1)の文章が50個ぐらいまでなら 文章が50個ぐらい、という表現が分からないのですが、 b1 = a1.slice(0,1) ... b50 = a50.slice(0,1) のように、50個の文が続くということでしょうか。 何となくですが、 > const [timeStamp, email, id, name, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, (中略)a54] = e.values; となっていて、頭はtimeStamp, email, id, nameで4つです。 e.values で与えている個数が足りないのではないでしょうか。要は、50個しか入っていない、とか。
88yasu

2020/11/03 06:44

コメントを頂きありがとうございます。 >b1 = a1.slice(0,1) >... >b50 = a50.slice(0,1) >のように、50個の文が続くということでしょうか。 その通りです。 これが51個になるとエラーが出ます。 >e.values で与えている個数が足りないのではないでしょうか。要は、50個しか入っていない、とか。 ありがとうございます。 確かにそれはある気がします。 e.valuesに何個データが入っているかや、最大数の増やし方が分かりません。 プログラム初心者でして、このようなページを見て、スプレッドシートからデータを取得する方法を学んだ次第です。 https://tonari-it.com/gas-gmail-message-plane-html-body/
88yasu

2020/11/03 06:49

全体はこのような形です。 スプレッドシートから回答者毎のデータを取り出して、先頭の文字を抽出して数値化して、因子(項目)別で足すしてスプレッドシートの新しいセルに書き出す。というものを作りたいです。 function sendMessage(e) { const [timeStamp, email, id, name, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54] = e.values; b1 = a1.slice(0,1) b2 = a2.slice(0,1) b3 = a3.slice(0,1) b4 = a4.slice(0,1) b5 = a5.slice(0,1) b6 = a6.slice(0,1) b7 = a7.slice(0,1) b8 = a8.slice(0,1) b9 = a9.slice(0,1) b10 = a10.slice(0,1) b11 = a11.slice(0,1) b12 = a12.slice(0,1) b13 = a13.slice(0,1) b14 = a14.slice(0,1) b15 = a15.slice(0,1) b16 = a16.slice(0,1) b17 = a17.slice(0,1) b18 = a18.slice(0,1) b19 = a19.slice(0,1) b20 = a20.slice(0,1) b21 = a21.slice(0,1) b22 = a22.slice(0,1) b23 = a23.slice(0,1) b24 = a24.slice(0,1) b25 = a25.slice(0,1) b26 = a26.slice(0,1) b27 = a27.slice(0,1) b28 = a28.slice(0,1) b29 = a29.slice(0,1) b30 = a30.slice(0,1) b31 = a31.slice(0,1) b32 = a32.slice(0,1) b33 = a33.slice(0,1) b34 = a34.slice(0,1) b35 = a35.slice(0,1) b36 = a36.slice(0,1) b37 = a37.slice(0,1) b38 = a38.slice(0,1) b39 = a39.slice(0,1) b40 = a40.slice(0,1) b41 = a41.slice(0,1) b42 = a42.slice(0,1) b43 = a43.slice(0,1) b44 = a44.slice(0,1) b45 = a45.slice(0,1) b46 = a46.slice(0,1) b47 = a47.slice(0,1) b48 = a48.slice(0,1) b49 = a49.slice(0,1) b50 = a50.slice(0,1) b51 = a51.slice(0,1) b52 = a52.slice(0,1) b53 = a53.slice(0,1) b54 = a54.slice(0,1) range = e.range; p1 = range.getRow(); sheet = SpreadsheetApp.getActiveSheet() sheet.getRange(p1, 60).setValue(parseInt(b1) + parseInt(b7)+ parseInt(b13)+ parseInt(b19)+ parseInt(b25)+ parseInt(b31)+ parseInt(b37)+ parseInt(b43)+ parseInt(b49)).getValue(); sheet.getRange(p1, 61).setValue(parseInt(b2) + parseInt(b8)+ parseInt(b14)+ parseInt(b20)+ parseInt(b26)+ parseInt(b32)+ parseInt(b38)+ parseInt(b44)+ parseInt(b50)).getValue(); sheet.getRange(p1, 62).setValue(parseInt(b3) + parseInt(b9)+ parseInt(b15)+ parseInt(b21)+ parseInt(b27)+ parseInt(b33)+ parseInt(b39)+ parseInt(b45)+ parseInt(b51)).getValue(); sheet.getRange(p1, 63).setValue(parseInt(b4) + parseInt(b10)+ parseInt(b16)+ parseInt(b22)+ parseInt(b28)+ parseInt(b34)+ parseInt(b40)+ parseInt(b46)+ parseInt(b52)).getValue(); sheet.getRange(p1, 64).setValue(parseInt(b5) + parseInt(b11)+ parseInt(b17)+ parseInt(b23)+ parseInt(b29)+ parseInt(b35)+ parseInt(b41)+ parseInt(b47)+ parseInt(b53)).getValue(); sheet.getRange(p1, 65).setValue(parseInt(b6) + parseInt(b12)+ parseInt(b18)+ parseInt(b24)+ parseInt(b30)+ parseInt(b36)+ parseInt(b42)+ parseInt(b48)+ parseInt(b54)).getValue(); }
dodox86

2020/11/03 06:50

このコメント欄ではなく、質問文を編集し、追記するかたちでコードを載せてください。
88yasu

2020/11/03 07:02

教えて頂きありがとうございます。 どのように記載したら教えて頂く方に分かりやすいかも分かっていませんでした。 なるべく伝わるように編集させていただきました。
dodox86

2020/11/03 07:18

私が回答できるとは限らないのであまり細かい指摘をしてウンザリされるのも気が引けるのですが、teratailでコードを張る際はマークダウン記法と言うものが使えます。他の質問を見ていただけると分かると思いますが、見易さが格段に違います。逆に使わないとインデント(字下げ)も崩れて読みづらくなり、それだけで回答は離れがちになります。最初は面倒かもしれませんが、 https://teratail.com/help/question-tips#questionTips3-5-1 https://teratail.com/questions/238564 あたりを参考にしてソースコードを適切に表示するようにしましょう。 > トリガーのエラーとしては以下のように出てきます。 > TypeError: Cannot read property 'slice' of undefined > at sendMessage(コード:58:17) このエラーメッセージには重要な情報が書かれています。すなわちエラーが発生した、ソースコードの該当する位置です。58行目のはずですが、sendMesasge()関数の58行目が何か、示しましょう。 > 代入の最大数は50個なのかと思い、 普通はそんなことはありません。その程度で最大数に達するのであれば、実際的なプログラムは作れませんので、当面心配しなくてだいじょうぶです。
dodox86

2020/11/03 07:25

まぁ、あまり質問文が長いと「字数オーバー」になって投稿できないそうなので、それも含めて出来る範囲で良いかもしれません。質問がしっかりしていればそれだけ回答の確率が上がるはず、という程度のアドバイスです。
88yasu

2020/11/03 07:48

本当に丁寧に教えて頂きありがとうございます。 どう質問すればよいかも分かっていないため、とても勉強になります。 58行目が54番目の代入のコードだったのでこれを消していったら50個にしたときに上手くいきました。 もしよければ教えて頂きたいのは、 at sendMessage(コード:58:17)の17は何を意味するかということです。58行目から17行目にかけてエラーが起きていると解釈したのですが、合っているのでしょうか。
dodox86

2020/11/03 08:24

> at sendMessage(コード:58:17)の17は何を意味するかということです。58行目から17行目にかけてエラーが起きていると解釈したのですが、合っているのでしょうか。 いいえ。58行目の17文字目でエラー、ということです。「b54 = a54.slice(0,1)」であれば恐らくsliceの位置だと思います。エラーメッセージ > TypeError: Cannot read property 'slice' of undefined からすると代入ができないのではなくて、undefined である変数、つまりa54の値がundefinedで無効であるために、sliceメソッドが使えないのだと思いますよ。
88yasu

2020/11/03 08:29

ありがとうございます。 勉強になります。
guest

回答1

0

自己解決

dodox86様

ありがとうございます。
at sendMessage(コード:58:17)が”58行目の17文字目でエラー”ということを教えて頂いて調べ直してやっと分かりました。
Google formsの質問の16番目の質問が抜けていて、質問が53個しかなかったため出ていたエラーでした。

自分の初歩的なミスです。
読んで下さった方、ご指摘を頂いたdodox86様本当にありがとうございます。

投稿2020/11/03 08:59

88yasu

総合スコア13

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

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

dodox86

2020/11/03 09:19

最終的にご自身で解決できてよかったと思います。
88yasu

2020/11/03 09:51

ありがとうございます。 dodox86様のおかげです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問