如何提高创建60张纸的APP脚本的性能? [英] How to improve performance of app-script that creates 60 sheets?

查看:12
本文介绍了如何提高创建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});
});

推荐答案

在收到评论和反馈后,我做了一些实验:

  1. 使用应用程序脚本复制60张工作表大约需要80秒
  2. 使用Sheets rest API终结点batchUpdate复制60张工作表大约需要10秒-(删除这60张工作表大约需要1秒)。使用请求正文方法DuplicateSheetRequest
  3. 通过高级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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆