基于条件优化的应用程序脚本循环复制
App Scripts Loop Copy based on Condition Optimization
我编写了一个 App 脚本,仅当 A 列(在 Sheet 1 中)的单元格包含值“复制”时,才将值从 Sheet 2 复制到 Sheet 1。此脚本运行良好,但超过 50 行 运行 的速度很慢,有没有办法优化此函数以使其 运行 更快?
function CopyValues() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var Sheet1 = ss.getSheetByName('Sheet1');
var Sheet2 = ss.getSheetByName('Sheet2');
//If Column A = Copy then copy the values in Sheet 2 column B to W to sheet 1
for (var i=1; i<=1000; i = i + 1)
if (Sheet1.getRange(i,1,100,1).getValue() == 'Copy'){
Sheet2.getRange(i,2,1,23).copyTo(Sheet1.getRange(i,2,1,23),SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};
};
试试这个:
function CopyValues() {
const ss = SpreadsheetApp.getActive();
const sh1 = ss.getSheetByName('Sheet1');
const sh2 = ss.getSheetByName('Sheet2');
const vs = sh1.getRange(1,1,sh1.getLastRow(),23).getValues().filter(r => r[0] == "Copy");
sh2.getRange(sh2.getLastRow() + 1, 1,vs.length,23).setValues(vs)
}
我相信你的目标如下。
- 您的脚本运行良好。并且,您想降低脚本的处理成本。
在这次修改中,我想通过Sheets减少脚本的处理成本API。我想当你的情况使用Sheets API 时,过程成本可以降低一些。
当 Sheets API 反映在您的脚本中时,它变成如下。
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
function CopyValues2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var Sheet1 = ss.getSheetByName('Sheet1');
var Sheet2 = ss.getSheetByName('Sheet2');
// Retrieve copied row index.
var rows = Sheet1.getRange("A1:A" + Sheet1.getLastRow()).getValues().reduce((ar, [a], i) => {
if (a == "Copy") ar.push(i);
return ar;
}, []);
// Create a request body for using the batchUpdate method of Sheets API.
var srcSheetId = Sheet2.getSheetId();
var dstSheetId = Sheet1.getSheetId();
var requests = rows.map(e => ({ copyPaste: { source: { sheetId: srcSheetId, startRowIndex: e, endRowIndex: e + 1, startColumnIndex: 1, endColumnIndex: 24 }, destination: { sheetId: dstSheetId, startRowIndex: e, endRowIndex: e + 1, startColumnIndex: 1 }, pasteType: "PASTE_NORMAL" } }));
// Request Sheets API using the created request body.
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
- 当这个脚本是运行的时候,我以为你的展示脚本的结果是通过降低流程成本得到的。
参考文献:
我编写了一个 App 脚本,仅当 A 列(在 Sheet 1 中)的单元格包含值“复制”时,才将值从 Sheet 2 复制到 Sheet 1。此脚本运行良好,但超过 50 行 运行 的速度很慢,有没有办法优化此函数以使其 运行 更快?
function CopyValues() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var Sheet1 = ss.getSheetByName('Sheet1');
var Sheet2 = ss.getSheetByName('Sheet2');
//If Column A = Copy then copy the values in Sheet 2 column B to W to sheet 1
for (var i=1; i<=1000; i = i + 1)
if (Sheet1.getRange(i,1,100,1).getValue() == 'Copy'){
Sheet2.getRange(i,2,1,23).copyTo(Sheet1.getRange(i,2,1,23),SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};
};
试试这个:
function CopyValues() {
const ss = SpreadsheetApp.getActive();
const sh1 = ss.getSheetByName('Sheet1');
const sh2 = ss.getSheetByName('Sheet2');
const vs = sh1.getRange(1,1,sh1.getLastRow(),23).getValues().filter(r => r[0] == "Copy");
sh2.getRange(sh2.getLastRow() + 1, 1,vs.length,23).setValues(vs)
}
我相信你的目标如下。
- 您的脚本运行良好。并且,您想降低脚本的处理成本。
在这次修改中,我想通过Sheets减少脚本的处理成本API。我想当你的情况使用Sheets API 时,过程成本可以降低一些。
当 Sheets API 反映在您的脚本中时,它变成如下。
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
function CopyValues2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var Sheet1 = ss.getSheetByName('Sheet1');
var Sheet2 = ss.getSheetByName('Sheet2');
// Retrieve copied row index.
var rows = Sheet1.getRange("A1:A" + Sheet1.getLastRow()).getValues().reduce((ar, [a], i) => {
if (a == "Copy") ar.push(i);
return ar;
}, []);
// Create a request body for using the batchUpdate method of Sheets API.
var srcSheetId = Sheet2.getSheetId();
var dstSheetId = Sheet1.getSheetId();
var requests = rows.map(e => ({ copyPaste: { source: { sheetId: srcSheetId, startRowIndex: e, endRowIndex: e + 1, startColumnIndex: 1, endColumnIndex: 24 }, destination: { sheetId: dstSheetId, startRowIndex: e, endRowIndex: e + 1, startColumnIndex: 1 }, pasteType: "PASTE_NORMAL" } }));
// Request Sheets API using the created request body.
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
- 当这个脚本是运行的时候,我以为你的展示脚本的结果是通过降低流程成本得到的。