Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何在一段时间后删除谷歌工作表_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 如何在一段时间后删除谷歌工作表

Google apps script 如何在一段时间后删除谷歌工作表,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个从主数据表中读取的小项目。一旦用户在搜索表中输入了他的号码。创建具有该编号的新图纸。我想在一段时间后,即5分钟后删除该工作表。顺便说一句,另一个用户工作表可能会在任何时候创建,所以我希望代码相应地删除每个用户的工作表 可能还有另一种解决方案可以删除除前两张图纸(数据表和搜索表)之外的所有已创建图纸 有人能帮我查一下密码吗 function onEdit(e) { var source = SpreadsheetApp.getActiveSpreadsheet();

我有一个从主数据表中读取的小项目。一旦用户在搜索表中输入了他的号码。创建具有该编号的新图纸。我想在一段时间后,即5分钟后删除该工作表。顺便说一句,另一个用户工作表可能会在任何时候创建,所以我希望代码相应地删除每个用户的工作表

可能还有另一种解决方案可以删除除前两张图纸(数据表和搜索表)之外的所有已创建图纸

有人能帮我查一下密码吗

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