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

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

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

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

Q&A

解決済

2回答

11325閲覧

【GAS】複数行を別シートの最終行に貼り付けたい

snowww000

総合スコア12

Google Apps Script

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

0グッド

1クリップ

投稿2021/06/07 03:30

Google Apps Scriptで質問があります。

シート"from"のA3:Pをシート"to"の最終行に追加したいです。

Exception: The number of rows in the data does not match the number of rows in the range. The data has 3 but the range has 1.
とエラーが出ます。

何卒ご回答宜しくお願い致します。

GAS

1function myFunction() { 2var ss = SpreadsheetApp.getActiveSpreadsheet(); // 現在アクティブなスプレッドシートを取得 3 4var sheet_copyFrom = ss.getSheetByName('from'); 5var sheet_copyTo = ss.getSheetByName('to'); 6 7var fromRow = sheet_copyFrom.getLastRow(); 8 9var copyValue = sheet_copyFrom.getRange('A3:P'+fromRow).getValues(); 10 11var targetRow = sheet_copyTo.getLastRow()+1; 12 13sheet_copyTo.getRange('A'+targetRow+':P'+targetRow).setValues(copyValue); 14sheet_copyFrom.clearContents(); 15}

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

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

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

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

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

guest

回答2

0

こんにちは。

fromシートには、3行分のデータを作っているのかと思います。
copyValueの要素数(行数)と、'A'+targetRow+':P'+targetRowの行数の範囲が異なっているのでこのエラーが出てるのかと思います。

Exception: The number of rows in the data does not match the number of rows in the range. The data has 3 but the range has 1.

という事で、rangeの終了位置を正しくしてあげればOKです。

【P列の行番号】 = 【toシートの最終行+1】+【copyValueの行数】

要素番号(0開始)とカウント(1開始)の-1で調整
【P列の行番号】 = 【toシートの最終行+1】+【copyValueの行数】 - 1

イメージ説明

投稿2021/06/07 04:02

neonemo

総合スコア191

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

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

snowww000

2021/06/07 05:39

丁寧なご回答ありがとうございました。
guest

0

ベストアンサー

貼り付け元のデータの行数と、貼り付け先の行数が合っていないということなので

sheet_copyTo.getRange('A'+targetRow+':P'+targetRow).setValues(copyValue);

sheet_copyTo.getRange('A'+targetRow+':P'+(targetRow + fromRow - 3)).setValues(copyValue);

としてみてはいかがでしょうか。

投稿2021/06/07 04:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

snowww000

2021/06/07 05:43

ありがとうございました。 そのままを使わせて頂き思い通りに動きました。 コピー元のシートが3行から30行まで変動するので3行しかだめかと思いきや何行でもコピーしてくるれ理想的な形になりました。 もし可能ならばなぜ -3 なのかを教えて頂ければ幸いです。
退会済みユーザー

退会済みユーザー

2021/06/07 06:07 編集

-3は、貼り付け元シートのデータの開始行の分です。 最初の貼り付け元データを取得するとき、 var copyValue = sheet_copyFrom.getRange('A3:P'+fromRow).getValues(); としていますよね あと、fromRowは、貼り付け元シートの最終行を表しています。 仮にここで fromRow (貼り付け元シートの最終行)が20行目だと仮定しましょう。 そうすると、貼り付け元データの行数は'A3:P'+fromRow=「A3:P20」すなわち「3行目から20行目まで」となり、 「3行目から20行目まで」の行数を計算すると、20-3+1=18行となります。   次に、貼り付け先を処理する部分では、 var targetRow = sheet_copyTo.getLastRow()+1; というように、targetRow(=貼り付けを開始する行)は「貼り付け先シートの最終行+1」行目となっています。 次の部分、 sheet_copyTo.getRange(~~).setValues(copyValue); が実際に貼り付け先シートにデータを貼り付ける処理になりますが、 ~~の中には、貼り付け元のデータと同じ列数・行数を指定しなければいけません。(そうしないとエラーになるから) ここで貼り付けようとしているデータは、先ほどの仮定を前提とすると、20-3+1=18行なのですから、 「~~」も18行分を指定しなければなりません。 ここで、targetRow(貼り付け先シートの貼り付け開始行)を仮に「101行目」であると仮定します。 すると、貼り付けるデータは「18行」なのですから、 「~~」の部分には、「101行目から118行目まで」(A101:P118)を指定する必要があります。 つまり「118」という数字を、計算で指定できればいいわけです。 これまでに出てきた数字をうまい具合に組み合わせると、 targetRow(=101) + 20 - 3 = 118となっていることがわかります。 (もともと「3」というのは貼り付け元シートの開始行でした) したがって、これを一般化すると 「'A'+targetRow+':P'+(targetRow + fromRow - 3)」 とすれば、貼り付け元データの行数と貼り付け先の行数を一致させることができるとわかります。
snowww000

2021/06/07 07:30

本当に丁寧にわかりやすくお答え頂きありがとうございます。 理解できました。いわれてみれば「なるほど」と納得です。 ベストアンサーをこれ以上は押せないので高評価をいっぱい押しておきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問