如何提高创建60张纸的APP脚本的性能? [英] How to improve performance of app-script that creates 60 sheets?
本文介绍了如何提高创建60张纸的APP脚本的性能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在Google Sheets中有一个使用insertSheet
方法的简单应用程序脚本。它循环一个数组,从而创建60张图纸。但是,该脚本慢得令人痛苦--需要几分钟才能完成。
如何提高此方法的性能?或者,有没有其他方法可以更高效地创建60张工作表--比如使用Sheets REST API?
上下文
我有一个主表,它的作用类似于模板。对此工作表进行更改时,需要将其复制60次,因此用户不必反复进行更改。
CurrentCode
var listOfSheetsToCreate = ['1', '2', '3', ... '60'];
var ss = SpreadsheetApp.getActive();
var templateSheet = ss.getSheetByName('templateSheet');
listOfSheetsToCreate.forEach(function(sheetName) {
ss.insertSheet(sheetName, ss.getNumSheets(), {template: templateSheet});
});
推荐答案
在收到评论和反馈后,我做了一些实验:
- 使用应用程序脚本复制60张工作表大约需要80秒。
- 使用Sheets rest API终结点batchUpdate复制60张工作表大约需要10秒-(删除这60张工作表大约需要1秒)。使用请求正文方法DuplicateSheetRequest
- 通过高级Google服务运行批量更新。执行时间稍长一些--大约15秒,但脚本要简单得多--这要归功于@Tanaike。这是我最终使用的解决方案--来解决我的问题。我可能还应该提到,运行该脚本实际上会导致工作表在浏览器中重新加载--我不知道为什么。但在重新加载时,将创建所有工作表。
我仍然认为10秒是慢的,所以如果你有任何改进这个性能的想法,请告诉我。我已经提供了我的代码,以获得下面的灵感。我真的很期待一些现代的脚本...
表格REST API Node.js代码
export async function batchUpdate() {
// moved authentication to another method.
const authObect = await getAuthenticated();
// The batchupdate endpoint needs the sheet id of the template sheet, so that's why we need the following code
const ssInQuestion = await sheets.spreadsheets.get({
auth: authObect,
spreadsheetId: <spreadsheetId>
});
const masterSheet = ssInQuestion.data.sheets.find(v => v.properties.title.toLowerCase() === 'master');
if (!masterSheet) {
throw new Error(`Could not find master sheet in spreadsheet, will now exit!`);
}
// If we want to delete, the requests to the batch update should look like this:
// const requests: sheets_v4.Schema$Request[] = ssInQuestion.data.sheets
// .filter(v => v.properties.title.includes(' - test'))
// .map(v => v.properties.sheetId)
// .map(v => ({
// deleteSheet: {
// sheetId: v
// }
// } as sheets_v4.Schema$Request));
const requests: sheets_v4.Schema$Request[] = [];
for (let i = 0; i <= 60; i++) {
requests.push({
duplicateSheet: {
sourceSheetId: masterSheet.properties.sheetId,
newSheetName: `${i} - test`
}
})
}
const batchUpdateOptions: sheets_v4.Params$Resource$Spreadsheets$Batchupdate = {
spreadsheetId: <SpreadSheetIdInQuestion>,
auth: authObect,
requestBody: {
includeSpreadsheetInResponse: false,
requests
}
}
let start = new Date()
await sheets.spreadsheets.batchUpdate(batchUpdateOptions);
let end = +new Date() - +start;
console.info('Execution time: %dms', end)
}
高级Google服务应用程序脚本
// I ended up with something that looks like this:
function deleteListOfSheets(listOfSheets) {
if (listOfSheets.length == 0) {
return;
}
var ss = SpreadsheetApp.getActive();
var deleteRequests = listOfSheets.map(function(v) {
return {
deleteSheet: {
sheetId: v.getSheetId()
}
}
});
Sheets.Spreadsheets.batchUpdate({
includeSpreadsheetInResponse: false,
requests: deleteRequests
}, ss.getId())
}
function createListOfSheets(listOfSheetNames, templateSheetId) {
if (listOfSheetNames.length == 0) {
Logger.log("List of sheets to create had 0 length, will now exit")
return;
}
var ss = SpreadsheetApp.getActive();
// Create the array of 'create requests'
var createRequests = listOfSheetNames.map(function(v) {
return {
duplicateSheet: {
sourceSheetId: templateSheetId,
newSheetName: v
}
}
});
// Finally dispatch!
Sheets.Spreadsheets.batchUpdate({
includeSpreadsheetInResponse: false,
requests: createRequests
}, ss.getId())
}
这篇关于如何提高创建60张纸的APP脚本的性能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文