web-dev-qa-db-ja.com

Google Appsスクリプトを使用して、あるGoogleスプレッドシートから別のGoogleスプレッドシートに行をコピーする方法は?

こんにちは、Googleアプリのスクリプトを使用して、特定の行を1つのスプレッドシートから別のスプレッドシートにコピーしたいと思っていました。

14
Ani

こちらのドキュメントをご覧ください。

http://code.google.com/googleapps/appsscript/service_spreadsheet.html

コピー元のスプレッドシートで作業しているとします。

現在のスプレッドシートとターゲットスプレッドシートのハンドルを取得する必要があります。ターゲットスプレッドシートのIDを取得する必要があります。詳細は上のリンクにあります。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.openById("abc1234567");

次に、これらのスプレッドシート内の特定のシートを選択する必要があります。行が「New Stuff」という名前のシートにあり、「Archive」という名前のターゲットスプレッドシートにシートがあるとします。

var source_sheet = ss.getSheetByName("New Stuff");
var target_sheet = target.getSheetByName("Archive");

さて、Googleアプリのスプレッドシートが使用する概念は範囲です。範囲はセルのチャンクです。したがって、範囲の下限と範囲の範囲を決定する必要があります。シートに7列あり、10行目が必要だとします。

var source_range = source_sheet.getRange("A10:G10");
var target_range = target_sheet.getRange("A1:G1");

その行を取得して、ターゲットシートの最初の行に配置します。今実際のコピーのために:

source_range.copyTo(target_range);

これで完了です。

これにより、常にターゲットシートの最初の行が上書きされます。それを止めるためにできることはたくさんあります。常に最初の行を使用する代わりに、シートオブジェクトメソッドを使用して最後の行を検索し、後に追加して、範囲として使用できます。

var last_row = target_sheet.getLastRow();
target_sheet.insertRowAfter(last_row);
var target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));

これにより、行をコピーするたびに、シートの下部に追加されます。

19
Keith Twombley

copyTo メソッドは、コンテンツを別のスプレッドシートのシートにコピーできないため、十分に文書化されていません。

以下のようにgetValues ans setValuesを使用することができます。

function CopyDataToNewFile() {
  var sss = SpreadsheetApp.openById('0AjN7uZG....'); // sss = source spreadsheet
  var ss = sss.getSheetByName('Monthly'); // ss = source sheet
  //Get full range of data
  var SRange = ss.getDataRange();
  //get A1 notation identifying the range
  var A1Range = SRange.getA1Notation();
  //get the data values in range
  var SData = SRange.getValues();

  var tss = SpreadsheetApp.openById('8AjN7u....'); // tss = target spreadsheet
  var ts = tss.getSheetByName('RAWData'); // ts = target sheet
  //set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);

}  
17
ubique

私もこれに遭遇しました。あるシートから別のシートにすべてをコピーする素敵な回避策をなんとか見つけました(画像、グラフ、スクリプトなどを除く)。数式、値、フォーマットを確実にコピーします。

基本的に解決策は

  • ソースシートを一時的なソースシートとしてターゲットスプレッドシートにコピーする
  • 一時ソースシートからターゲットシートにデータをコピーする
  • 一時ソースシートを削除する

コード:

var sss = SpreadsheetApp.openById(spreadsheet); // sss = source spreadsheet
var ss = sss.getSheetByName(sheet); // ss = source sheet
var ss_temp = ss.copyTo(targetsheet);
var tss = SpreadsheetApp.openById(spreadsheet); // tss = target spreadsheet
var ts = tss.getSheetByName(sheet); // ts = target sheet
var range2Copy = ss_temp.getRange(range);
range2Copy.copyTo(ts.getRange(range));
bss.setActiveSheet(ss_temp);
bss.deleteActiveSheet()

上記に基づいて、マスタースプレッドシートから多くのコピーを更新できるスプレッドシートを作成しました。約15のコピーがあるため、コピーと貼り付けの多くのアクションを節約できます。

7

これを行う別の方法は、ソース(または任意の範囲)をソースからターゲットスプレッドシートにインポートすることです。

「source-spreadsheet-sheet-name」と呼ばれるソーススプレッドシートのシートから行3をインポートする場合、ターゲットの場所の最初の列に次の式を入力します。

=IMPORTRANGE("source-spreadsheet-key","source-spreadsheet-sheet-name!3:3")

どこ "source-spreadsheet-key"は、URLから抽出するソーススプレッドシートの一意のIDです。

初めて行う場合は、セキュリティメッセージが表示されます。

enter image description here

確認するだけで、行全体が自動的に入力されます。

ソース領域に変更を加えた後、インポートされたセルを更新するのに数分かかる場合があることを覚えておいてください。ただし、ターゲットスプレッドシートで動作しているときにctrl-Eまたはctrl-shift-Eのいずれかを押して、速度を上げることができます。

1
ellockie

Range.setValuesを使用することをお勧めします。出発地と目的地の範囲が類似している限り、どのシートのどの範囲でも機能します。

これがサンプルコードです:

function openCSV() {

  //Buscamos el archivo
  var files = DriveApp.getFilesByName("ts.csv");

  //Cada nombre de archivo es unico, por eso next() lo devuelve.
  var file = files.next();

  fileID = file.getId();

  //Abrimos la spreadsheet, seleccionamos la hoja
  var spreadsheet = SpreadsheetApp.openById(fileID);
  var sheet = spreadsheet.getSheets()[0];

  //Seleccionamos el rango  
  var range = sheet.getRange("A1:F1");
  values = range.getValues();

  //Guardamos un log del rango
  //Logger.log(values);

  //Seleccionamos la hoja de destino, que es la activeSheet 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var SSsheet = ss.getSheets()[0];

  //Seleccionamos el mismo rango y le asignamos los valores
  var ssRange = SSsheet.getRange("A1:F1");
  ssRange.setValues(values);

}
0
Pulpo

多分この投稿はあなたを助ける http://l.rw.rw/gscripts 。さまざまな条件でのコピー機能の機能について説明します(範囲によるデータの制限、カスタムフィルター、挿入または置換メソッドでターゲットにデータを配置)。そして、あなたがそれを試すことができる実例があります。

0
Oleg Shaydenko

これは機能しません-「ターゲット範囲とソース範囲は同じスプレッドシート上にある必要があります」というエラーを返します。これと同じようなことをする必要があるようです:

function copyRow_ (origSheetName, destSheetName, origRowNumber, destRowNumber)
{
  var origSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(origSheetName);
  var destSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(destSheetName);
  var origLastCol = origSheetObject.getLastColumn();
  var arrOrigData = origSheetObject.getRange(origRowNumber, 1, 1, origLastCol).getValues();
  var destlastRow = destSheetObject.getLastRow() + 1;
  if (destRowNumber)
    destlastRow = destRowNumber;
  var cont;
  for (cont = 0; cont < origLastCol; cont++)
       destSheetObject.getRange(destlastRow, 1+cont).setValue(arrOrigData[0][cont]);
}

(露骨に盗まれた ここ

0
Sean