異なるスプレッドシートからセルをコピーする

-異なるシートを参照する
現在アクティブになっているスプレッドシートではなく、
ドライブ上にある別のスプレッドシートを参照したいとき
スプレッドシートのIDを指定することで参照できる。

SpreadsheetApp.openById(id)
スプレッドシートIdからスプレッドシートオブジェクトを取得する。

このidの取得方法は、2つあるっぽい。
1)URLから取得
 「https://docs.google.com/a/yourdomain/spreadsheet/ccc?key=[この部分]#gid=0」
  の[この部分]の英数字。

2)参照したいスプレッドシートのIdを表示させて取得

var sid = SpreadsheetApp.getActiveSpreadsheet().getId();
Browser.msgBox(sid);

上記を実行して、ウィンドウに表示された英数字。


1)でもうまくいくらしいんだけど、私はなぜかできず。
2)のほうで成功したので、私は2)を推奨。




-セルの情報をコピーする
copyToメソッドをつかう

var sheet = SpreadsheetApp.getActiveSheet();
var rangeToCopy = sheet.getRange(1, 1, sheet.getMaxRows(), 1);

//値と書式(シングルセル)A1をD1へコピー
rangeToCopy.copyTo(sheet.getRange(1, 4));

//値と書式(複数セル)A1:B4をD2:E5へコピー
var rangeToCopy = sheet.getRange(1, 1, sheet.getMaxRows(), 2);
rangeToCopy.copyTo(sheet.getRange(2, 4));

こんな風に使える。
ただし、copyToメソッドは同じシート内でしか使用できないため、今回は不使用。


setValue()でコピーする

var ss_copyFrom = SpreadsheetApp.getActiveSpreadsheet();
var ss_copyTo = SpreadsheetApp.openById('xxxxxxxxxx');
var sheet_copyFrom = ss_copyFrom.getSheetByName('部署一覧');
var sheet_copyTo = ss_copyTo.getSheetByName('部署一覧');

var copyValue = sheet_copyFrom.getRange('A2:B6').getValues();
sheet_copyTo.getRange('A2:B6').setValues(copyValue);


-その他注意

別のシートを参照するとき、getRangeを行列で指定することはできない。
今回は、最終行にデータをコピーしたかったため、以下のように実行。

var lastRow2 = list_sheet.getLastRow();
var lastRow21 = lastRow2 + 1;

var copyValue = sheet.getRange('A'+lastRow+':N'+lastRow).getValues();
list_sheet.getRange('B'+lastRow21+':O'+lastRow21).setValues(copyValue);

シングルクオーテーションとプラスで文字列が結合できるらしい。
今回は列を指定しなくていいからよかったけど、列の場所も変数で取得したい場合、
面倒くさそうだ。



参考
[GAS][スプレッドシート]別のスプレッドシートにデータをコピーするには : 逆引きGoogle Apps Script
[GAS][スプレッドシート]セルをコピーするには : 逆引きGoogle Apps Script
[GAS][スプレッドシート]Idからスプレッドシートオブジェクトを取得するには : 逆引きGoogle Apps Script
http://googlestyle.client.jp/sheet/class_range.html
長文日記