google-apps-script - Apps 脚本超时优化
问题描述
我有一个 Apps 脚本,我让用户运行它以从他们的 Google Drive 中删除已识别文件的列表。整个列表位于 Google 表格中,跨越 66K 行。其中一些用户每人拥有超过 5000 个项目,但大多数都达到了 App Script 运行时限制。
我正在寻找一种方法来优化我当前的脚本以在每个项目的读取/操作中更有效,迭代已经操作/已删除的项目,或者寻找一种方法让脚本再次自动拾取/启动继续删除项目。
目前执行如下:
- 用户访问我编写的 webapp 前端并点击提交按钮。
- 按钮触发读取/回收操作 {deleteFile()} 抓取 Session.getactiveuser() 并开始在 66k 列表中查找匹配的电子邮件地址。
- 如果项目在执行时间内完成,用户会收到一个提示,表明他们已经完成并且可以退出。
- 如果没有,用户会收到超时错误并要求重试。
编辑:我正在尝试使用这篇文章中的“工作示例(线性迭代器)”来实现一个简单的延续令牌,但我不断收到“异常:无效参数: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.`);
}
谢谢,
解决方案
推荐阅读
- css - 材质图标不会在 Angular 生产版本中呈现
- c++ - 停止 cmake target_link_libraries 将静态库的两个目标文件链接到静态库本身
- vba - 更改/编辑发件人姓名的显示
- c# - WPF 允许用户使用粗体/斜体/下划线等格式化 TextBlock
- javascript - 如何在 HTML 中显示 JavaScript 函数的结果?
- c - 头文件与源文件中的内联函数定义
- r - R - 根据条件观察创建一个新列并将其应用于主 df
- sql-server - Linq 看不到按存储过程从组中计数列
- javascript - 使用 Vuex Store 和 Nuxt.js 实现图像重定向
- vue.js - Vue 从指令中访问“on”和“class”指令