首页 > 解决方案 > 在 Google 应用脚本中运行已安装触发器的问题

问题描述

对我来说应用脚本相当新。写了这个庞大的脚本,然后在时间触发器上设置它,它只是拒绝运行。我已经尽可能多地往回走,至少要让一些事情起作用,但我什至不能让一个基本的祝酒词出现在一分钟的时间间隔内。

这是我构建的脚本,我直接运行它来启用触发器:

function createTriggers() {
  
  ScriptApp.newTrigger('testTime')
      .timeBased()
      .everyMinutes(1)
      .create();
};

它调用的函数非常简单,我用过很多次,也改过很多次:

var gSS = SpreadsheetApp.openById("this_1s/the.1d")

function testTime() {
  var d = new Date()
  var Start = d.getTime();
  
  gSS.toast(Start, "Testing", 30)
};

那么它应该如何工作,如果我直接调用“testTime”函数,它会在相关电子表格上出现一个小吐司弹出窗口,并保持可见 30 秒。当我运行触发函数'createTriggers'时,什么也没有发生..

请帮忙!如果我不能让它自己运行,我写的所有代码都是徒劳的.. :(

***** 编辑 - 20 年 8 月 4 日 - 基于评论 *****

这可能是一个 XY 示例,我尝试运行一小部分原始代码,当我直接运行它时它可以工作,但它也不能在这里工作。这个片段没有任何面向 UI 的功能,所以它应该'不是问题.. 我所做的只是采用上述触发函数并将名称更改为'testClear',它调用以下函数:

function testClear(){
  sheetVars(1)
  clearSheetData(sheetSPChange)
};

function sheetVars(numSprints) {
  // returns the global vars for this script
  
  try {
    sheetNameSprints = "Name of Sprint Sheet"
    sheetNameSPChange = "Name of Story Point Change Sheet"
    sheetSprints = gSS.getSheetByName(sheetNameSprints)
    sheetSPChange = gSS.getSheetByName(sheetNameSPChange)
    arraySprints = iterateColumn(sheetSprints,"sprintIDSorted", 1, numSprints)
  }
  catch(err) {
    Logger.log(err)
  };
};

function iterateColumn(sheet, header, columnNum, numRows) {
  // Create an array of first column values to iterate through
  // numRows is an int, except for the string "all"
  
  var gData = sheet.getDataRange();
  var gVals = gData.getValues();
  var gLastR = ""
  var gArray = []
  
  
  // check how many rows to iterate
  
  if (numRows == "all") {
    gLastR = gData.getLastRow();
  }
  else {
    gLastR = numRows
  };
  
  // Iterate through each row of columnNum column
  
  for (i = 1; i < gLastR; i++){
    // iterate through
    
    if(gVals[i][columnNum] !== "" && gVals[i][columnNum] !== header){
      // push to array
      
      gArray.push(gVals[i][columnNum]);
    }
    else if (gVals[i][columnNum] == "") {
      break
    };
  };
  
  return gArray
};

function clearSheetData(sheet) {
  // Delete all rows with data in them in a sheet
    
  try {
    if (!sheet.getRange(sheet.getLastRow(),1).isBlank()){
      sheet.getRange(2, 1, sheet.getLastRow()-1, sheet.getLastColumn()-1).clearContent()
      Logger.log("Sheet cleared from old data.")
    }
    else {
      sheet.deleteRows(2, sheet.getLastRow()-1)
      Logger.log("Sheet rows deleted from old data.")
    };
  }
  catch(err){
    Logger.log(err)
    emailLogs()
  };
};

'emailLogs' 功能是一个基本的 MailApp,所以我会收到有关脚本问题的通知:

function emailLogs() {
  // Email Nikita the loggs of the script on error
  
  var email = "my work email@jobbie"
  var subject = "Error in Sheet: " + gSS.getName()
  var message = Logger.getLog()
  MailApp.sendEmail(email, subject, message)
};

感谢评论,我现在发现了处决页面!:D 这是编辑脚本的错误。

2020 年 8 月 4 日,上午 10:48:18 错误异常:无法从此上下文中调用 SpreadsheetApp.getUi()。在未知功能

标签: google-apps-scriptgoogle-sheetstriggers

解决方案


要在每个特定“时间”(每次n迭代)显示敬酒,请将其添加到for循环中

if (!((i+1) % n)) spreadsheet.toast("Working...")

从问题

2020 年 8 月 4 日,上午 10:48:18 错误异常:无法从此上下文中调用 SpreadsheetApp.getUi()。在未知功能

上述错误意味着您的时间驱动脚本正在调用一个只能在用户在 Web 浏览器中打开电子表格时才能执行的方法。

换句话说,toast不能用于时间驱动的触发器。解决方案是使用客户端代码每分钟显示该消息。为此,您可以使用边栏和递归函数来执行setTimeout

参考


推荐阅读