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

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

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

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

Q&A

解決済

2回答

10477閲覧

GAS 配列結合→length取得→エラーが表示される

code_ugoite

総合スコア18

Google Apps Script

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

0グッド

1クリップ

投稿2018/05/19 09:35

編集2018/05/19 11:29

前提・実現したいこと

Googleフォームが3つあり、回答の集計先としてスプレッドシートがA, B, Cの3つあります(1行目はヘッダー)。

タイムスタンプ質問1質問2質問3質問4質問5
2018/05/19 19:30:00回答1a,回答1b(チェックボックスで選択回答)回答者の名前回答3(短文)回答4(短文)回答5(短文)

質問の数はフォームによって異なりますが、最初の5問は共通の質問です。

いま、Google Apps Scriptを使い、

ステップ1. 集計先となっているスプレッドシートの内容を配列として取得(スプレッドシートA→配列i, B→配列ii, C→配列iii)
ステップ2. スプレッドシートDに、配列i→シートa, 配列ii→シートb, 配列iii→シートc にそれぞれ書き込む
ステップ3. スプレッドシートDのシートdの1行目には予め質問番号などを書いておき、2行目以降に、シートa, b, cの内容を1行目のヘッダーを除いてコピー・統合

そして、シートdを見れば、フォーム3つへの回答が全て見られるようにしようとしています。

添付のコードでは、ステップ1と2までは処理できているようで、シートa, b, cには、配列として所得した元のスプレッドシートの内容が書き込まれています。
しかし、ステップ3で、以下の「無効な範囲です」というエラーが出てしまいます。

どのようにコードを修正すればよいのでしょうか。
質問文がわかりにくく、申し訳ありません。お力を貸して頂ければ幸いです。

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

6 は無効な範囲です。12 にする必要があります。(行 33、ファイル「コード」)

該当のソースコード

Google

1 2function form_response_consolidation() { 3 4//スプレッドシートA, B, Cの内容を配列として取得、スプレッドシートDのシートa, b, cに書き込む 5 var ss = SpreadsheetApp.openById("スプレッドシートDのID"); 6 7 var Form1 = SpreadsheetApp.openById("スプレッドシートAのID").getSheets()[0]; 8 var Form1data = Form1.getDataRange().getValues(); 9 var Form1dest = ss.getSheetByName("スプレッドシートD・シートa"); 10 Form1dest.clear(); 11 Form1dest.getRange(1, 1, Form1data.length, Form1data[0].length).setValues(Form1data); 12 13 var Form2 = SpreadsheetApp.openById("スプレッドシートBのID").getSheets()[0]; 14 var Form2data = Form2.getDataRange().getValues(); 15 var Form2dest = ss.getSheetByName("スプレッドシートD・シートb"); 16 Form2dest.clear(); 17 Form2dest.getRange(1, 1, Form2data.length, Form2data[0].length).setValues(Form2data); 18 19 var Form3 = SpreadsheetApp.openById("スプレッドシートCのID").getSheets()[0]; 20 var Form3data = Form3.getDataRange().getValues(); 21 var Form3dest = ss.getSheetByName("スプレッドシートD・シートc"); 22 Form3dest.clear(); 23 Form3dest.getRange(1, 1, Form3data.length, Form3data[0].length).setValues(Form3data); 24 25 26// スプレッドシートD・シートdの2行目以降に、シートa, b, cの内容を1行目のヘッダーを除いてコピー 27 Form1data.splice(0,1); 28 Form2data.splice(0,1); 29 Form3data.splice(0,1); 30 var arrData = Form1data.concat(Form2data, Form3data) 31 32 var copyTo = SpreadsheetApp.openById("スプレッドシートDのID").getSheetByName("シートd"); 33 copyTo.clear(); 34 copyTo.getRange(2, 1, arrData.length, arrData[0].length).setValues(arrData); //エラー発生箇所 35 36}

試してみたこと(解決にはつながらず)

arrData[0].lengthの代わりに、とりあえず12を設定
→相変わらず6 は無効な範囲です。12 にする必要があります。(行 33、ファイル「コード」)

6の倍は12、ということでarrData[0].lengtharrData[0].length*2としてみる
12 は無効な範囲です。24 にする必要があります。(行 33、ファイル「コード」)

var arrData = Form1data.concat(Form2data, Form3data) Logger.log(arrData[0].length)``` var copyTo = SpreadsheetApp.openById("スプレッドシートDのID").getSheetByName("シートd");

→ログ:[18-05-19 20:08:53:960 JST] 12.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

まだ、GASを触り始めたばかりで詳しく分かりませんが、
setvalues は、配列サイズを全部揃えないと使えないという認識です。

undefined を null にして、配列サイズを揃えたら問題なく動くので。。

投稿2018/05/20 06:23

PINARELLO

総合スコア20

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

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

code_ugoite

2018/05/20 07:32 編集

for (var i = 0 ; i < arrData.length ; i++){ arrData[i].length = arrData[0].length; } をコードに追加し、配列サイズを全て1行目に揃えてやると、範囲エラーは出てこなくなりました。 ありがとうございます!
guest

0

A,B,Cのデータを一つの配列 arrData にしてDにコピーする必要があるのですか?
A,B,Cで、データの列数が違うため、配列 arrData 内でデータの列数が少ないシートの部分の値がundefinedとなっているから setValues で配列のサイズが違うとエラーが起きているのでは?

投稿2018/05/19 17:09

PINARELLO

総合スコア20

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

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

code_ugoite

2018/05/20 04:54

> A,B,Cのデータを一つの配列 arrData にしてDにコピーする必要があるのですか? その通りです!わかりにくく申し訳ありません… 仰る通り、A,B,Cでデータの列数(質問の数)が違っています。 そして、それぞれのデータごとの列数もバラバラです。 Aの1行目にはデータが12列あり、全データの中で最も列数が多く、かつデータが確実に入っています。 そこで、コードを書き換えて、arrDataに統合してDにコピーする段で、 // Form1data.splice(0,1); //Aの1行目はspliceしない Form2data.splice(0,1); //Bの1行目はsplice Form3data.splice(0,1); //Cの1行目もsplice var arrData = Form1data.concat(Form2data, Form3data) として、arrData[0].length でAの1行目のlengthを取得してみた…のですが、相変わらず全く同じ、  6 は無効な範囲です。12 にする必要があります。(行 33、ファイル「コード」) というエラーが出ます…。 配列のサイズが全データで揃っていない限り、setValues は使えないと考えたほうがいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問