首页 > 解决方案 > Apps 脚本超时优化

问题描述

我有一个 Apps 脚本,我让用户运行它以从他们的 Google Drive 中删除已识别文件的列表。整个列表位于 Google 表格中,跨越 66K 行。其中一些用户每人拥有超过 5000 个项目,但大多数都达到了 App Script 运行时限制。

我正在寻找一种方法来优化我当前的脚本以在每个项目的读取/操作中更有效,迭代已经操作/已删除的项目,或者寻找一种方法让脚本再次自动拾取/启动继续删除项目。

目前执行如下:

  1. 用户访问我编写的 webapp 前端并点击提交按钮。
  2. 按钮触发读取/回收操作 {deleteFile()} 抓取 Session.getactiveuser() 并开始在 66k 列表中查找匹配的电子邮件地址。
  3. 如果项目在执行时间内完成,用户会收到一个提示,表明他们已经完成并且可以退出。
  4. 如果没有,用户会收到超时错误并要求重试。

编辑:我正在尝试使用这篇文章中的“工作示例(线性迭代器)”来实现一个简单的延续令牌,但我不断收到“异常:无效参数:continuationToken”错误,不知道如何解决这个问题。编辑代码块以反映新代码

const sheetID = "IDgoeshere"; //sheet with ids and user names 
const logSheetId = "IDgoeshere"; //sheet to record user subbmision
const sheetName = 'Sheet1' //name of the sheet in the doc
const sheetName2 = 'Sheet1'
const emailID = Session.getActiveUser().getEmail();
var userProperties = PropertiesService.getUserProperties();
var continuationToken1 = userProperties.getProperty('CONTINUATION_TOKEN');
var start = new Date();
var end = new Date();
var maxTime = 1000 * 60 * 4; 

function doGet() {
  return HtmlService.createHtmlOutputFromFile('index1');
}


function getEmailFromWebAPP(element){
  var getEmailID = Session.getActiveUser().getEmail();
  deleteFile();
  return getEmailID; 
};


function deleteFile() {
  const spreadsheet = SpreadsheetApp.openById(sheetID);
  const sheet = spreadsheet.getSheetByName(sheetName);
  const lastRow = sheet.getLastRow();
  const values = sheet.getRange(2, 4, lastRow - 1, 3).getValues();

  values.forEach((row, index) => {
    const owner = row[0];
    const id = row[2];
    if (continuationToken == null) {  // first time execution, get all files from Drive
      if (emailID == row[1]) {
        try {
          var file = DriveApp.getFileById(row[2])
          if (file.isTrashed == true) {
            console.info('was trashed');
            row++;
          }
          else {
            file.setTrashed(true);
          }
          //file.setTrashed(true);
          //console.info(`Trashed ${id} belonging to ${owner}`);
        }
        catch (e) {
          console.info(`Unable to find file with id ${id}`);
        }
      }
      else {
        // not the first time, pick up where we left off
        var files = DriveApp.continueFileIterator(continuationToken1); ***//errors out here***
      }
    }
    while (files.hasNext() && end.getTime() - start.getTime() <= maxTime) {
      var file = files.next();
      Logger.log(file.getName());
      end = new Date();
    }

    if (files.hasNext()) {
      var continuationToken = files.getContinuationToken();
      userProperties.setProperty('CONTINUATION_TOKEN', continuationToken);
    }
    else {
      // Delete the token
      PropertiesService.getUserProperties().deleteProperty('CONTINUATION_TOKEN');
    }
  
});

const spreadsheet2 = SpreadsheetApp.openById(logSheetId);
const sheet2 = spreadsheet2.getSheetByName(sheetName2);
const datetime = new Date();
sheet2.appendRow([datetime, emailID]);


console.info(`All items deleted, you may close this tab now.`);
}

谢谢,

标签: google-apps-scriptgoogle-sheets

解决方案


推荐阅读