使用 Google Apps 脚本将手动触发脚本更改为时间驱动触发器
2022-07-26
291
我有一个适用于 Google Sheets 的应用脚本,当我手动触发它时,它会运行,但我希望它由时间驱动,每小时自动运行一次。我尝试使用 Apps Script UI 进行设置,它看起来像这样:
但我一直收到此错误消息:
异常:无法从此上下文调用 SpreadsheetApp.getUi()。 在未知函数中
我也尝试将时间触发器写入脚本,但一直出现错误。这是当前脚本,当我手动触发它时,它确实可以正常工作。
var ui = SpreadsheetApp.getUi();
function onOpen(e){
ui.createMenu("Gmail Manager").addItem("Get Emails by Label", "getGmailEmails").addToUi();
}
function getGmailEmails(){
var label = GmailApp.getUserLabelByName('EmailsToBeExported');
var threads = label.getThreads();
for(var i = threads.length - 1; i >=0; i--){
var messages = threads[i].getMessages();
for (var j = 0; j <messages.length; j++){
var message = messages[j];
extractDetails(message);
}
threads[i].removeLabel(label);
}
}
function extractDetails(message){
var dateTime = message.getDate();
var subjectText = message.getSubject();
var senderDetails = message.getFrom();
var bodyContents = message.getPlainBody();
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
activeSheet.appendRow([dateTime, senderDetails, subjectText, bodyContents]);
}`
2个回答
您还可以通过修改代码来保持可用性:
try {
const UI = SpreadsheetApp.getUi();
} catch (err) {
const UI = {
alert: function() {return;},
prompt: function() {return true;},
button: {YES: false},
ButtonSet: {YES_NO: false}
}
}
您必须手动设置 UI 的参数,但它的作用是让您的代码按预期运行和处理事情。
我特意将提示设置为 true,将按钮设置为 false。这样,如果我检查它们是否等于特定按钮,它将始终评估为 false。
例如
var result = UI.prompt("Some title", "Some question", UI.ButtonSet.YES_NO);
if (result == UI.Button.YES) {//always false
//This part does not evaluate
}
您必须确保可以在整个脚本中始终如一地执行此操作。您可能希望将值的分配(取决于您的条件语句)更改为字符串、数字或其他唯一内容,或者将条件语句更改为包含“===”等。提示是最棘手的。通过代码中的此更改,您可以在从 Google 表格中运行脚本时获得 UI 提示和警报。当您从外部运行它时,它会跳过它们,例如定时执行或其他会从外部激活您的脚本的事情。
retupmoc258
2023-02-17