如何将 values Google Apps Script/Sheets 从一个电子表格复制并粘贴到另一个电子表格?

How to copy and paste as values Google Apps Script/Sheets from one spreadsheet to another?

所以我有一个包含 9k 行和 30 多列的巨大电子表格。我想将此电子表格复制到另一个电子表格(仅限值)。

之前我使用这段代码是成功的,但是由于数据的增加,现在脚本超时(1800s +)。有没有办法优化这个脚本或者完全可以替代的选项?

function temp() {

  var sss = SpreadsheetApp.openById('XYZ'); // sss = source spreadsheet
  //var ss = sss.getSheets()[4]; // ss = source sheet

  var ss = sss.getSheets(); // ss = source sheet
  var id=4; //default number

  for(var i in ss)
  {
    var sheet = ss[i];
    if(sheet.getName()== "ABC")
    {  id=i;
      break;
    }
  }
  console.log(id);
  
  ss=sss.getSheets()[id];

  //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();
  SpreadsheetApp.flush();
  var tss = SpreadsheetApp.getActiveSpreadsheet(); // tss = target spreadsheet
  var ts = tss.getSheetByName('ABC'); // ts = target sheet
  //set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);


}

从一个跨页复制sheet到另一个

function copyfromonetoanother() {
  const sss = SpreadsheetApp.getActive();
  const dss = SpreadsheetApp.openById("dssid");
  const ssh = sss.getSheetByName('Sheet1');
  const vs = ssh.getDataRange().getValues();
  const dsh = dss.getSheetByName('Sheet1');
  dsh.getRange(dsh.getLastRow() + 1,1,vs.length,vs[0].length).setValues(vs);
}

如果你想select源范围:

function copyfromonetoanother() {
  const sss = SpreadsheetApp.getActive();
  const dss = SpreadsheetApp.openById("dssid");
  const ssh = sss.getSheetByName('Sheet1');
  const vs = ssh.activeRange().getValues();
  const dsh = dss.getSheetByName('Sheet1');
  dsh.getRange(dsh.getLastRow() + 1,1,vs.length,vs[0].length).setValues(vs);
}

此函数附加到目标的底部sheet

function appenddatatobottomofdestination() {
  const sssId = "source spreadsheet id"; 
  const sss = SpreadsheetApp.openById(sssId);
  const dss = SpreadsheetApp.getActive();
  const dssId = dss.getId();
  const ssh = sss.getSheetByName('Sheet1');//Source sheet
  const srg = ssh.getRange(1,1,ssh.getLastRow(),ssh.getLastColumn());
  const dsh = dss.getSheetByName("Sheet1");//Destination sheet
  var vs = Sheets.Spreadsheets.Values.get(sssId, `${ssh.getName()}!${srg.getA1Notation()}`).values;
  const drg = dsh.getRange(dsh.getLastRow() + 1, 1, vs.length,vs[0].length);//appends to bottom of spreadsheet
  Sheets.Spreadsheets.Values.update({values: vs}, dssId, `${dsh.getName()}!${drg.getA1Notation()}`, {valueInputOption: "USER_ENTERED"});
}

我相信你的目标如下。

  • 您想降低脚本的处理成本。

在这种情况下,我想建议使用表格API。 . Also, when the benchmark is measured between Spreadsheet service (SpreadsheetApp) and Sheets API, when Sheets API is used for reading and writing the values for Spreadsheet, it was confirmed that the process cost could be reduced. Ref

中已经提到了这一点

当您的脚本使用 Sheets API 时,它变成如下。

修改后的脚本:

在您使用此脚本之前,please enable Sheets API at Advanced Google services。并请设置源 Spreadsheet ID 和 sheet 名称。

function temp() {
  var sourceSpreadsheetId = "XYZ"; // Please set the source Spreadsheet ID.
  var destinationSpreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();
  var sourceValues = Sheets.Spreadsheets.Values.get(sourceSpreadsheetId, "ABC").values;
  Sheets.Spreadsheets.Values.update({values: sourceValues}, destinationSpreadsheetId, "ABC", {valueInputOption: "USER_ENTERED"});
}

参考文献: