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

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

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

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

Q&A

解決済

2回答

10004閲覧

【GAS】複数のシートを一つのシートにまとめたいです。

kazuyahonda

総合スコア9

Google Apps Script

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

1グッド

2クリップ

投稿2018/02/04 12:45

前提・実現したいこと

プログラム、GAS、teratail初心者です。

1.GASで複数のシートの値を一つのシートにまとめるプログラムを作成しています。

2.コピーの範囲は2行目から最終行、列は16列です。

3.貼り付け先のシートには、2行目、3列目からの貼り付けをしようとしています。

4.一つずつシートをコピペをしていくと、処理速度が遅くなったため、
全てのシートの値を一度配列に格納して、setValuesでまとめて書き出したいと考えています。

5.配列に格納はできましたが、
書き出しの際に以下のエラーメッセージが発生し、
書き出しがうまくいきません。

以下がコードとエラーメッセージとなります。
こちら解決策をご教授いただけますとありがたいです。

※質問に足りない情報などありましたらご指摘お願いいたします。

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

◆エラーメッセージ 2 は無効な高さです。6にする必要があります。

該当のソースコード

GAS

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sh_all = spreadsheet.getSheetByName('all'); //コピー先のシート名all var copy_column_range = 16 //コピーする列数 //全てのシートをallシートにコピー。 var c_sheet_cnt = 2; //コピーするシート数 var last_l_row = 2; //何行目からコピーするか※すべてのシート var dt_all_sheet = []; // 全てのシートのデータの配列  //全てのシートのデータを配列に格納してから書き出し for (var i=0;i<c_sheet_cnt;i++){ var sheet = spreadsheet.getSheets()[i]; var new_l_row = sheet.getLastRow(); //各シートの最終行を取得 //シートの値を配列に格納 var copyValue = sheet.getRange(2,1,new_l_row-1,copy_column_range).getValues(); dt_all_sheet.push(copyValue); // シートの値を配列に格納 var last_l_row = last_l_row + new_l_row-1; } //Browser.msgBox(last_l_row); //sheet内容を書き出し sh_all.getRange(2,3,last_l_row,copy_column_range+2).setValues(dt_all_sheet);

試したこと

sh_all.getRange(2,3,last_l_row,copy_column_range+2).setValues(dt_all_sheet);

が違うとエラーが出ていたため、範囲が合っていないと思い下記方法を試しました。

仮シートを二つ作成。
仮シート1には
2行目の1列~16列に1
3行目の1列~16列に2

仮シート2には
2行目の1列~16列に3
3行目の1列~16列に4
の値があります。

・last_l_rowをdt_all_sheet.lengthにした。
→2 は無効な範囲です。18 にする必要があります。とエラー

・直接数字を打ち込んでみた。
→何を打ち込んでも2は無効な高さです~にしてくださいと表示。

他も試しましたが、うまく行かない状況です。
こちらご回答いただけますと幸いです。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

concatを使って2次元配列を結合するところがポイントになると思います。
あとシート名all自体は結合の範囲から除く必要があると思ったので分岐を入れました。
コピーするシート数も自動的にカウントさせるほうがいいかと思います。
添削が下手で恐縮ですができました。

function myFunction() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sh_all = spreadsheet.getSheetByName('all'); //コピー先のシート名all var copy_column_range = 16 //コピーする列数 //全てのシートをallシートにコピー。 var c_sheet_cnt = spreadsheet.getSheets().length; //コピーするシート数 var last_l_row = 2; //何行目からコピーするか※すべてのシート var dt_all_sheet = []; // 全てのシートのデータの配列  //全てのシートのデータを配列に格納してから書き出し for (var i=0;i<c_sheet_cnt;i++){ var sheet = spreadsheet.getSheets()[i]; if (sheet.getName() === "all") { continue; } var new_l_row = sheet.getLastRow(); //各シートの最終行を取得 //シートの値を配列に格納 var copyValue = sheet.getRange(2,1,new_l_row-1,copy_column_range).getValues(); var dt_all_sheet = dt_all_sheet.concat(copyValue); var last_l_row = last_l_row + new_l_row-1; } //sheet内容を書き出し sh_all.getRange(2,3,dt_all_sheet.length,copy_column_range).setValues(dt_all_sheet); }

投稿2018/02/04 16:48

true

総合スコア440

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

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

0

すみません、自己完結しました。

横から失礼します。

ちょうど同じことをやりたく、そのまま流用させていただいたのですが、

Exception: The number of rows in the range must be at least 1.
myFunction @ コード.gs:18

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

初心者で初歩的な質問で恐縮ですが、解決方法をご教示いただけますと幸いです。

投稿2021/03/31 01:28

編集2021/03/31 02:16
hiroaki0724

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問