Google apps script 如何在一段时间后删除谷歌工作表
我有一个从主数据表中读取的小项目。一旦用户在搜索表中输入了他的号码。创建具有该编号的新图纸。我想在一段时间后,即5分钟后删除该工作表。顺便说一句,另一个用户工作表可能会在任何时候创建,所以我希望代码相应地删除每个用户的工作表 可能还有另一种解决方案可以删除除前两张图纸(数据表和搜索表)之外的所有已创建图纸 有人能帮我查一下密码吗Google apps script 如何在一段时间后删除谷歌工作表,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个从主数据表中读取的小项目。一旦用户在搜索表中输入了他的号码。创建具有该编号的新图纸。我想在一段时间后,即5分钟后删除该工作表。顺便说一句,另一个用户工作表可能会在任何时候创建,所以我希望代码相应地删除每个用户的工作表 可能还有另一种解决方案可以删除除前两张图纸(数据表和搜索表)之外的所有已创建图纸 有人能帮我查一下密码吗 function onEdit(e) { var source = SpreadsheetApp.getActiveSpreadsheet();
function onEdit(e)
{
var source = SpreadsheetApp.getActiveSpreadsheet();
var sheet = source.getSheetByName('Search');
var val = sheet.getRange('A2').getValue();
sheet.copyTo(source).setName(val);
if (e.range.getSheet().getName() === 'Search')
{
if (e.range.getA1Notation() === 'A2')
{
SpreadsheetApp
.getActiveSpreadsheet()
.getSheetByName('Search')
.getRange('B2')
.setValue('=QUERY(Data!A2:M,"Select * WHERE H ="""&A2&"""")')
Utilities.sleep(10000);
var ss = SpreadsheetApp.getActive();
var sheet2 = ss.getSheetByName(val);
//sheet2.activate();
ss.deleteSheet(sheet2);
SpreadsheetApp.flush();
}
}
}
创建新工作表后,您可以在5分钟后删除它
function onEdit(e) {
// ...
var userSheet = sheet.copyTo(source).setName(val);
// ...
createDeletionTrigger_(userSheet);
// ...
}
/**
* Create a trigger to delete the specified sheet after a set amount of time.
* @param {Sheet} sheet - The sheet to be deleted.
*/
function createDeletionTrigger_(sheet) {
DeletionQueue.append(sheet.getSheetId());
ScriptApp.newTrigger('deleteNextUserSheet').timeBased().after(5 * 1000).create();
}
/**
* Delete the next sheet in the user's queue and the delete the calling trigger.
*/
function deleteNextUserSheet(e) {
DeletionQueue.deleteNext();
deleteTrigger(e.triggerUid);
}
/**
* Find a trigger by its unique ID and delete it.
* @param {string} triggerUid - The trigger's unique ID.
*/
function deleteTrigger(triggerUid) {
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
var trigger = triggers[i];
if (trigger.getUniqueId() === triggerUid) {
ScriptApp.deleteTrigger(trigger);
break;
}
}
}
/**
* The queue of IDs for sheets that should be deleted.
*/
var DeletionQueue = {
key: 'deletionQueue',
cache: CacheService.getUserCache(),
/**
* Get the queue of sheet IDs in the order they were added.
* @returns {number[]}
*/
get: function() {
var queue = this.cache.get(this.key);
return queue == null ? [] : JSON.parse(queue);
},
/**
* Append a new sheet ID to the queue for future deletion.
* @param {number} sheetId - The new sheet ID to append.
*/
append: function(sheetId) {
var queue = this.get();
queue.push(sheetId);
this.update(queue);
},
/**
* Replace the cached queue with a new array of sheet IDs.
* @param {number[]} queue - The new array of sheet IDs.
*/
update: function(sheetIds) {
this.cache.put(this.key, JSON.stringify(sheetIds));
},
/**
* Delete the next sheet (FIFO) and update the cached queue.
*/
deleteNext: function() {
var queue = this.get();
var sheetId = queue.shift();
var spreadsheet = SpreadsheetApp.getActive();
var sheets = spreadsheet.getSheets();
for (var i in sheets) {
var sheet = sheets[i];
if (sheet.getSheetId() === sheetId) {
spreadsheet.deleteSheet(sheet);
this.update(queue);
break;
}
}
}
}
函数onEdit(e){
// ...
var userSheet=sheet.copyTo(源).setName(val);
// ...
createDeletionTrigger(用户页);
// ...
}
/**
*创建触发器以在设定的时间后删除指定的工作表。
*@param{Sheet}Sheet-要删除的工作表。
*/
函数createDeletionTrigger(工作表){
DeletionQueue.append(sheet.getSheetId());
ScriptApp.newTrigger('deleteNextUserSheet').timeBased().after(5*1000.create();
}
/**
*删除用户队列中的下一张工作表并删除调用触发器。
*/
函数deleteNextUserSheet(e){
DeletionQueue.deleteNext();
deleteTrigger(即triggerUid);
}
/**
*通过触发器的唯一ID查找触发器并将其删除。
*@param{string}triggerUid-触发器的唯一ID。
*/
函数deleteTrigger(triggerUid){
var triggers=ScriptApp.getProjectTriggers();
对于(var i=0;i
无法将值传递到触发器,因此需要将工作表保存在某个位置。我使用保存工作表ID,因为ID不能更改,但工作表名称可以更改。(请注意,缓存默认为10分钟到期,因此如果希望工作表ID的持续时间超过10分钟,则需要调整代码。)具体来说,我使用的是,这样不同的用户就不会删除彼此的工作表
因为这是一个队列,所以同一用户应该能够创建多个图纸,并且应该按照创建顺序正确删除这些图纸
有20个触发器/用户/脚本,令人发狂的是,它确实适用于“禁用的”触发器。因此,您需要在使用触发器后删除触发器,这可以通过使用触发器传递的
triggerUid
来完成。创建新工作表后,您可以在5分钟后删除它
function onEdit(e) {
// ...
var userSheet = sheet.copyTo(source).setName(val);
// ...
createDeletionTrigger_(userSheet);
// ...
}
/**
* Create a trigger to delete the specified sheet after a set amount of time.
* @param {Sheet} sheet - The sheet to be deleted.
*/
function createDeletionTrigger_(sheet) {
DeletionQueue.append(sheet.getSheetId());
ScriptApp.newTrigger('deleteNextUserSheet').timeBased().after(5 * 1000).create();
}
/**
* Delete the next sheet in the user's queue and the delete the calling trigger.
*/
function deleteNextUserSheet(e) {
DeletionQueue.deleteNext();
deleteTrigger(e.triggerUid);
}
/**
* Find a trigger by its unique ID and delete it.
* @param {string} triggerUid - The trigger's unique ID.
*/
function deleteTrigger(triggerUid) {
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
var trigger = triggers[i];
if (trigger.getUniqueId() === triggerUid) {
ScriptApp.deleteTrigger(trigger);
break;
}
}
}
/**
* The queue of IDs for sheets that should be deleted.
*/
var DeletionQueue = {
key: 'deletionQueue',
cache: CacheService.getUserCache(),
/**
* Get the queue of sheet IDs in the order they were added.
* @returns {number[]}
*/
get: function() {
var queue = this.cache.get(this.key);
return queue == null ? [] : JSON.parse(queue);
},
/**
* Append a new sheet ID to the queue for future deletion.
* @param {number} sheetId - The new sheet ID to append.
*/
append: function(sheetId) {
var queue = this.get();
queue.push(sheetId);
this.update(queue);
},
/**
* Replace the cached queue with a new array of sheet IDs.
* @param {number[]} queue - The new array of sheet IDs.
*/
update: function(sheetIds) {
this.cache.put(this.key, JSON.stringify(sheetIds));
},
/**
* Delete the next sheet (FIFO) and update the cached queue.
*/
deleteNext: function() {
var queue = this.get();
var sheetId = queue.shift();
var spreadsheet = SpreadsheetApp.getActive();
var sheets = spreadsheet.getSheets();
for (var i in sheets) {
var sheet = sheets[i];
if (sheet.getSheetId() === sheetId) {
spreadsheet.deleteSheet(sheet);
this.update(queue);
break;
}
}
}
}
函数onEdit(e){
// ...
var userSheet=sheet.copyTo(源).setName(val);
// ...
createDeletionTrigger(用户页);
// ...
}
/**
*创建触发器以在设定的时间后删除指定的工作表。
*@param{Sheet}Sheet-要删除的工作表。
*/
函数createDeletionTrigger(工作表){
DeletionQueue.append(sheet.getSheetId());
ScriptApp.newTrigger('deleteNextUserSheet').timeBased().after(5*1000.create();
}
/**
*删除用户队列中的下一张工作表并删除调用触发器。
*/
函数deleteNextUserSheet(e){
DeletionQueue.deleteNext();
deleteTrigger(即triggerUid);
}
/**
*通过触发器的唯一ID查找触发器并将其删除。
*@param{string}triggerUid-触发器的唯一ID。
*/
函数deleteTrigger(triggerUid){
var triggers=ScriptApp.getProjectTriggers();
对于(var i=0;i