2010-12-22 100 views

回答

21

退房這裏的文檔:

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"); 

現在,谷歌應用電子數據表使用的概念是範圍。範圍只是一大塊細胞。所以我們需要確定從範圍和範圍。假設你的工作表有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)); 

這樣每次複製一行時,它都會被添加到工作表的底部。

+8

此失敗,這兩個範圍必須在同一電子表格的錯誤消息。 – Josh 2012-07-16 05:35:14

+0

對不起,@Josh。他們可能已經改變了copyTo()的工作原理,我寫了這個答案(我非常肯定我測試了它並直接從我的測試文檔中複製了js行)。其他答案之一可能會更好。沒有實際*嘗試*其中任何一個,我的賭注是[ubique's answer](http://stackoverflow.com/a/11676703/23866)將起作用。 – 2016-03-22 02:38:15

0

這不起作用 - 返回一個錯誤「目標範圍和源範圍必須位於同一電子表格中。」看起來我們需要做一些與此類似:

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]); 
} 

(公然從here被盜)

6

我碰到了這一點。我設法弄清楚了一個很好的解決方法,可以從一張表格複製到另一張表格(圖片,圖表,腳本和其他東西除外)。它確實複製了公式,值,格式。

基本上解決方案是

  • 拷貝源片到目標電子表格作爲一個臨時源片
  • 從臨時源片的數據複製到所述目標薄片
  • 除去臨時源片

代碼:

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份拷貝,可以節省大量的複製粘貼操作。

10

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); 

} 
2

也許這篇文章可以幫助你http://l.rw.rw/gscripts3。它描述了不同條件下的複製功能的功能(按範圍限制數據,自定義過濾器,通過插入或替換方法將數據定位到目標)。並有可以嘗試的工作示例。

1

這樣做的另一種方法是將來源的行(或任何範圍)導入到目標電子表格中。

假設你想從所謂的「源電子表格表名」源電子表格的紙,放於目標位置的第一列下面的公式導入行3:

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

其中"source-spreadsheet-key"是您從其網址中提取的源電子表格的唯一標識。

如果你這樣做的第一次,就會出現安全消息:

enter image description here

剛剛確認,整個行會自動填充。

請記住,在源區域進行更改後,有時需要幾分鐘來更新導入的單元格。但是,您可以通過按ctrl-Ectrl-shift-E加速它,同時在目標電子表格中進行操作。

0

使用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); 

} 
相關問題