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

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

ただいまの
回答率

90.76%

  • Google Apps Script

    724questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 240

code_ugoite

score 7

 前提・実現したいこと

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、ファイル「コード」)

 該当のソースコード

function form_response_consolidation() {  

//スプレッドシートA, B, Cの内容を配列として取得、スプレッドシートDのシートa, b, cに書き込む
  var ss = SpreadsheetApp.openById("スプレッドシートDのID");

  var Form1 = SpreadsheetApp.openById("スプレッドシートAのID").getSheets()[0];
  var Form1data = Form1.getDataRange().getValues();
  var Form1dest = ss.getSheetByName("スプレッドシートD・シートa");
  Form1dest.clear();
  Form1dest.getRange(1, 1, Form1data.length, Form1data[0].length).setValues(Form1data);

  var Form2 = SpreadsheetApp.openById("スプレッドシートBのID").getSheets()[0];
  var Form2data = Form2.getDataRange().getValues();
  var Form2dest = ss.getSheetByName("スプレッドシートD・シートb");
  Form2dest.clear();
  Form2dest.getRange(1, 1, Form2data.length, Form2data[0].length).setValues(Form2data);

  var Form3 = SpreadsheetApp.openById("スプレッドシートCのID").getSheets()[0];
  var Form3data = Form3.getDataRange().getValues();
  var Form3dest = ss.getSheetByName("スプレッドシートD・シートc");
  Form3dest.clear();
  Form3dest.getRange(1, 1, Form3data.length, Form3data[0].length).setValues(Form3data);


// スプレッドシートD・シートdの2行目以降に、シートa, b, cの内容を1行目のヘッダーを除いてコピー
  Form1data.splice(0,1);
  Form2data.splice(0,1);
  Form3data.splice(0,1);
  var arrData = Form1data.concat(Form2data, Form3data)

  var copyTo = SpreadsheetApp.openById("スプレッドシートDのID").getSheetByName("シートd");
  copyTo.clear();
  copyTo.getRange(2, 1, arrData.length, arrData[0].length).setValues(arrData);    //エラー発生箇所

}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/20 16:25 編集

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/20 13: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 は使えないと考えたほうがいいのでしょうか?

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Google Apps Script

    724questions

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