【发布时间】:2020-03-14 09:19:27
【问题描述】:
我正在编写通过 Google 表单申请休假的脚本。我在网上找到了这个脚本,并一直在努力让它工作。提交表单时,脚本检索并使用事务 ID、请求者的电子邮件填充链接的电子表格,并将请求状态设置为“待处理”。然后它会向经理发送一封电子邮件,并在电子邮件中包含用于批准或拒绝请求的链接。
我已经完成了 onFormSubmit 函数。这一切正常。
当我使用 doGet(e) 函数时,我遇到了问题。它应该检索经理的响应并将电子表格状态从待处理更新为批准或拒绝。然后会向请求者发送一封包含结果的电子邮件。
当我单击电子邮件以批准或拒绝请求时,我会收到一条消息“需要授权才能执行该操作。”
当我尝试运行 doGet(request) 函数时,我收到错误:“TypeError: Cannot read property 'parameters' of undefined (line 42)”。
var responseID = request.parameters.id;
由于新服务,我是否可能需要重新授权脚本?但是,当我不断返回此错误时,这很困难。
任何帮助或想法将不胜感激。
这是完整的脚本:
function onFormSubmit(e) {
// Open the sheet which stores the responses
var ssID = 'My Sheet ID' // Replace with spreadsheet ID
var ssName = 'Form responses' // Replace with sheet name
var sheet = SpreadsheetApp.openById(ssID).getSheetByName(ssName);
// #1 - Identify the requestor's email address and save it to the sheet.
var email = Session.getEffectiveUser().getEmail();
sheet.getRange(sheet.getLastRow(), 7).setValue(email);
// #2 - Get the response ID and save it to the sheet.
var responseID = e.response.getId();
sheet.getRange(sheet.getLastRow(), 8).setValue(responseID);
// #3 - Set the status of the request to 'Pending'.
sheet.getRange(sheet.getLastRow(), 9).setValue('Pending');
// Create variables for email
var items = e.source.getItems();
var manager_email = e.response.getResponseForItem(items[4]).getResponse();
var subject = "A leave request has been submitted";
// Include form data in the body of the email
var message = "";
for(var i in items)
message += "\n\n" + items[i].getTitle() + ": " +
e.response.getResponseForItem(items[i]).getResponse();
// #4 - Insert approve and deny links within the body of the email
message += "\n\nClick link below to approve: https://script.google.com/macros/s/AKfycbxdS3cUP_oSjfphDaSNkn_5GuxxlPG6czVHH_wGJ2OxImqFASmZ/exec?id=" + responseID + "&status=Approved \n\n" + "Click link below to deny: https://script.google.com/macros/s/AKfycbxdS3cUP_oSjfphDaSNkn_5GuxxlPG6czVHH_wGJ2OxImqFASmZ/exec?id=" + responseID + "&status=Denied";
// #5 - Email the manager the request information
MailApp.sendEmail(manager_email, subject, message);
}
function doGet(request) {
// Retrieve the parameter information for response ID and stutus
var responseID = request.parameters.id;
var status = request.parameters.status;
// Open the sheet which stores the responses
var ssID = 'My Sheet ID' // Replace with spreadsheet ID
var ssName = 'Form responses' // Replace with sheet name
var sheet = SpreadsheetApp.openById(ssID).getSheetByName(ssName);
// Find the row where the ID in the URL equals the ID in the sheet and update the
// status to the parameter value
var data = sheet.getDataRange().getValues();
for (var i=1; i < data.length; i++) {
if (data[i][7] == responseID){
sheet.getRange(i+1,9,1,1).setValue(status);
var date = Utilities.formatDate(data[i][3],"NZ", "EEE, MMM d, yyyy");
var type = data[i][4];
var email = data[i][6];
}
}
if (status == 'Approved') {
var subject = 'Your request for time-off has been approved';
var message = 'Your request for time-off (' + type + ') on ' + date + ' has been approved.';
} else {
var subject = 'Your request for time-off has been denied';
var message = 'Your request for time-off (' + type + ') on ' + date + ' has been denied.';
}
// Send email to requestor alerting them of the approval/denial of request
MailApp.sendEmail(email, subject, message);
// Show message to manager that the response has been updated.
var result = "The request has been '" + status + "'.";
return ContentService.createTextOutput(result);
}
【问题讨论】:
-
这很奇怪,因为如果您使用 [正确的参数](developers.google.com/apps-script/guides/web#request_parameters) 请求,我们似乎应该这样做。您是从编辑器执行此操作吗?如果您确实记得这是预期的,因为您没有引入
doGet函数的输入变量。你是如何部署你的 webApp 的?您是作为自己还是作为提出请求的人执行此操作? -
您好,非常感谢您的帮助。我不知道我需要部署一个 Web 应用程序。我有多傻??当有人在没有完全了解其工作原理的情况下在线复制脚本时会发生这种情况。我现在让它工作了,所以它更新了批准状态,但是在 onFormSubmit 检索请求者的电子邮件时遇到了问题。它正在收集我的电子邮件,而不是活动用户的电子邮件。我已将它从 getEfctiveUser() 更改为 getActiveUser() 但收到相同的结果。 webApp 是否与我安装的触发器冲突,因为它在部署 webApp 之前工作正常?
-
它不应该真的干扰触发器,记住
onFormSubmit()是一个可安装的触发器,需要安装。并且您可以直接检索the event object (e.user) 的用户。不知道你现在有什么问题。 -
必须补充一点,这个脚本是在业务域上运行的。从我在线阅读的内容来看,只要他们在同一个域中,getEffectiveUser() 就应该返回提交表单的人的电子邮件。如果我错了或者您知道解决方法,请告诉我。不知道为什么 getActiveUser() 不能正常工作?我想我总是可以通过用户填写表单来检索电子邮件。
-
您使用的触发器已安装在您的帐户中,因此有效用户将是您。您可能应该尝试使用事件对象或尝试使用其他方法。喜欢 webapp 或更改表单以收集用户。
标签: google-apps-script google-sheets workflow google-forms