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

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

ただいまの
回答率

90.12%

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

解決済

回答 2

投稿 編集

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

Ryutaro-

score 6

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

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

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

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

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

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


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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

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

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

From

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

To

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

参考

追記

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

From

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

To

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/21 19:01

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

    キャンセル

  • 2019/04/21 19:36 編集

    申し訳ございません。
    var targetRow = sheet_copyTo.getLastRow()+1;の行を自分が誤って消していただけでした。

    また、重ね重ね恐縮なのですが、
    別のシートのB列からD列の範囲の枠内で書き込みがされた最終行から1行下にしたいのですが、これだとA列に日付や行番号が入っている場合、実際の空欄からかなりズレが生じてしまうのですが、何か対処方法等はございますでしょうか。

    キャンセル

  • 2019/04/21 21:50

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

    キャンセル

  • 2019/04/21 22:05

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

    キャンセル

0

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

という部分に対する試案

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/22 01:16

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

    キャンセル

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

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