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

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

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

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

Q&A

解決済

2回答

8419閲覧

Google Apps Scriptでの複数行を別シートの最終行にコピーする方法

Ryutaro-

総合スコア12

Google Apps Script

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

0グッド

0クリップ

投稿2019/04/21 08:25

編集2019/04/21 08:57

Google Spread Sheet上で、400行3列の範囲(A14:A414)の枠内で上から下へと記入していく中で、
書き込みがあったセルの塊だけに限定して、別のシートのB列からD列の範囲の枠内で書き込みがされた最終行から1行下の部分へと転記するマクロを作っています。

その際、シート1の指定範囲からシート2の最終行へとコピペする部分をGoogle Apps Scriptで記述していたところ、
"Exception: データの行数が範囲の行数と一致しません。データは 401 行ですが、範囲は 1.行です。(行 10、ファイル「未実装」)"

というエラーメッセージが返って来ました。

解決方法をどなたか教えて頂きたく存じます。

ソースコードは以下の通りです。

GAS

1コード 2function copy() { 3 var ss_copyFrom = SpreadsheetApp.getActiveSpreadsheet(); 4 var ss_copyTo = SpreadsheetApp.openById('転記先スプレッドシートのID'); 5 var sheet_copyFrom = ss_copyFrom.getSheetByName('転記元シート名'); 6 var sheet_copyTo = ss_copyTo.getSheetByName('転記先シート名'); 7 var copyValue = sheet_copyFrom.getRange('A14:C414').getValues(); 8 var targetRow = sheet_copyTo.getLastRow()+1; 9 sheet_copyTo.getRange('B'+targetRow+':D'+targetRow).setValues(copyValue); 10}

大変お手数お掛け致しますが、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

"転記元スプレッドシートの名前"のシートのデータ"A14:C414"を、"転記先スプレッドシートの名前"のシートの最終行のB列移行へコピーする。

この流れですと、次のような変更はいかがでしょうか。setValue(value)で値をセルへ入力する際、valueの配列のサイズをgetRange()で与えることで発生しているエラーは解消されると思われます。

From

javascript

1sheet_copyTo.getRange('B'+targetRow+':D'+targetRow).setValues(copyValue);

To

javascript

1sheet_copyTo.getRange(targetRow, 2, copyValue.length, copyValue[0].length).setValues(copyValue);

参考

追記

コメントにありました「コピー先のA列にはすでに値が入っており、B列の最終行とA列の最終行は異なり、B列の最終行の次の行に値をコピーしたい」との要望に対する修正案は次の通りです。ご確認ください。ご質問にあるスクリプトを書きのように修正し、動作をご確認ください。

From

javascript

1var targetRow = sheet_copyTo.getLastRow()+1; 2sheet_copyTo.getRange('B'+targetRow+':D'+targetRow).setValues(copyValue);

To

javascript

1var targetColumnB = sheet_copyTo.getRange("B1:B" + sheet_copyTo.getLastRow()).getValues(); 2var targetRow = 0; 3for (targetRow = targetColumnB.length - 1; targetRow >= 0; targetRow--) { 4 if (targetColumnB[targetRow][0]) { 5 targetRow += 2; 6 break; 7 } 8} 9sheet_copyTo.getRange(targetRow, 2, copyValue.length, copyValue[0].length).setValues(copyValue);

投稿2019/04/21 08:59

編集2019/04/21 12:50
kisojin

総合スコア899

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

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

Ryutaro-

2019/04/21 10:01

ありがとうございます。 書き換えたところ、"ReferenceError: targetRow is not defined"と返って来ます。 これは全角半角、スペースの問題でしょうか。
Ryutaro-

2019/04/21 12:00 編集

申し訳ございません。 var targetRow = sheet_copyTo.getLastRow()+1;の行を自分が誤って消していただけでした。 また、重ね重ね恐縮なのですが、 別のシートのB列からD列の範囲の枠内で書き込みがされた最終行から1行下にしたいのですが、これだとA列に日付や行番号が入っている場合、実際の空欄からかなりズレが生じてしまうのですが、何か対処方法等はございますでしょうか。
kisojin

2019/04/21 12:50

私の回答が不十分なためにご迷惑をお掛けしまして申し訳ありません。コメントから、今の状況は、コピー先のA列にはすでに値が入っており、B列の最終行とA列の最終行は異なり、B列の最終行の次の行に値をコピーしたいと理解しました。当初のご質問からこの状況を予測することができず、未熟さを痛感します。本当に申し訳ありません。本要望の修正案を回答へ追記させていただきました。ご確認下さい。
Ryutaro-

2019/04/21 13:05

とんでもないです。 おかげさまで、とても素敵なシートが完成しました。 いまいち要領を得ない質問から、このような非常に素晴らしいスクリプトを描いてくださり、 本当にありがとうございました。
guest

0

Google Spread Sheet上で、400行3列の範囲(A14:A414)の枠内で上から下へと記入していく中で、

書き込みがあったセルの塊だけに限定して、別のシートのB列からD列の範囲の枠内で書き込みがされた最終行から1行下の部分へと転記するマクロを作っています。

という部分に対する試案

javascript

1function onEdit(e) { 2 const curSheet = e.range.getSheet(); 3 if(curSheet.getName() !== '転記元シート名') { return; } 4 const c = e.range.getColumn(); 5 const startC = 2; 6 const endC = 4; 7 if(c < startC || c > endC) { return; } 8 const r = e.range.getRow(); 9 const startR = 14; 10 const endR = 414; 11 if(r < startR || r > endR) { return; } 12 const vals = curSheet.getRange(r, 2, 1, 3).getValues(); 13 const dest = e.source.getSheetByName('転記先シート名'); 14 const appendTo = dest.getRange("B:B").filter(String).length + 1; 15 dest.getRange(appendTo, 2, 1, 3).setValues(vals); 16}

投稿2019/04/21 16:15

papinianus

総合スコア12705

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

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

papinianus

2019/04/21 16:16

エラーは、おそらく別シートのほうに1行しか書き込みがなかったのだろうと思われる。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問