簡體   English   中英

如何使用谷歌應用腳本將一行從一個谷歌電子表格復制到另一個谷歌電子表格?

[英]How to copy a row from one google spreadsheet to another google spreadsheet using google apps script?

我想使用谷歌應用程序腳本將特定行從一個電子表格復制到另一個電子表格。

誰能幫我找到答案。

注意:此解決方案適用於將同一電子表格中的一個工作表中的行復制到另一個工作表,不適用於將工作表中的行復制到不同的電子表格中。

在此處查看文檔:

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

這樣,每次您復制一行時,它只會被添加到工作表的底部。

copyTo方法的文檔很少,因為它不允許您將內容復制到另一個電子表格中的工作表。

您可能想像下面這樣使用getValuessetValues

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

}

這不起作用 - 返回錯誤“目標范圍和源范圍必須在同一個電子表格中。” 看起來我們需要做類似的事情:

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

(公然從這里偷來的)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM