google-apps-script - 在 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()。在未知功能
解决方案
要在每个特定“时间”(每次n
迭代)显示敬酒,请将其添加到for
循环中
if (!((i+1) % n)) spreadsheet.toast("Working...")
从问题
2020 年 8 月 4 日,上午 10:48:18 错误异常:无法从此上下文中调用 SpreadsheetApp.getUi()。在未知功能
上述错误意味着您的时间驱动脚本正在调用一个只能在用户在 Web 浏览器中打开电子表格时才能执行的方法。
换句话说,toast
不能用于时间驱动的触发器。解决方案是使用客户端代码每分钟显示该消息。为此,您可以使用边栏和递归函数来执行setTimeout
参考
推荐阅读
- sql-server - 使用 OpenXML 分解 XML
- reactjs - gatsby-image 获取组件中未定义的道具
- indexeddb - 如何在 indexedDB 中引用多字段索引
- python - 如何在 Windows 上通过 Anaconda 安装 OpenCV?
- sql - Postgres 阻止了 AccessShareLock
- javascript - 执行 TestCafe 断言的正确方法是什么
- java - 为什么我使用多线程的时候,音乐还能播放,但是移动乐谱的显示没有了?
- python - 如何使用烧瓶在浏览器中显示存储在 mongodb 中的图像/pdf 文件?
- c - 错误:在 gettimeofday 的存根上取消引用指向不完整类型的指针
- google-apis-explorer - 无法删除课程 Google Classroom API