こんにちは、Googleアプリのスクリプトを使用して、特定の行を1つのスプレッドシートから別のスプレッドシートにコピーしたいと思っていました。
こちらのドキュメントをご覧ください。
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));
これにより、行をコピーするたびに、シートの下部に追加されます。
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);
}
私もこれに遭遇しました。あるシートから別のシートにすべてをコピーする素敵な回避策をなんとか見つけました(画像、グラフ、スクリプトなどを除く)。数式、値、フォーマットを確実にコピーします。
基本的に解決策は
コード:
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のコピーがあるため、コピーと貼り付けの多くのアクションを節約できます。
これを行う別の方法は、ソース(または任意の範囲)をソースからターゲットスプレッドシートにインポートすることです。
「source-spreadsheet-sheet-name」と呼ばれるソーススプレッドシートのシートから行3をインポートする場合、ターゲットの場所の最初の列に次の式を入力します。
=IMPORTRANGE("source-spreadsheet-key","source-spreadsheet-sheet-name!3:3")
どこ "source-spreadsheet-key"
は、URLから抽出するソーススプレッドシートの一意のIDです。
初めて行う場合は、セキュリティメッセージが表示されます。
確認するだけで、行全体が自動的に入力されます。
ソース領域に変更を加えた後、インポートされたセルを更新するのに数分かかる場合があることを覚えておいてください。ただし、ターゲットスプレッドシートで動作しているときにctrl-Eまたはctrl-shift-Eのいずれかを押して、速度を上げることができます。
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);
}
多分この投稿はあなたを助ける http://l.rw.rw/gscripts 。さまざまな条件でのコピー機能の機能について説明します(範囲によるデータの制限、カスタムフィルター、挿入または置換メソッドでターゲットにデータを配置)。そして、あなたがそれを試すことができる実例があります。
これは機能しません-「ターゲット範囲とソース範囲は同じスプレッドシート上にある必要があります」というエラーを返します。これと同じようなことをする必要があるようです:
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]);
}
(露骨に盗まれた ここ )