如何将谷歌应用程序脚本/表格作为值从一个电子表格复制和粘贴到另一个电子表



所以我有一个巨大的电子表格,有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);

}

我相信您的目标如下。

  • 您希望降低脚本的处理成本

在这种情况下,我建议使用Sheets API。尤里·克里斯蒂奇的评论中已经提到了这一点。此外,当在电子表格服务(SpreadsheetApp(和Sheets API之间测量基准时,当Sheets API用于读取和写入电子表格的值时,确认可以降低过程成本。参考

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

修改的脚本:

在使用此脚本之前,请在高级Google服务中启用Sheets API。请设置源电子表格ID和工作表名称。

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

参考文献:

  • 基准:使用谷歌应用程序脚本阅读和编写电子表格
  • 方法:spreadsheets.values.get
  • 方法:spreadsheets.values.update

从一个电子表格复制到另一个

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

如果您希望选择来源范围:

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

此函数附加到目标工作表的底部

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

相关内容

最新更新