我目前正在尝试设置审批工作流程。当谈到这些东西时,我还是比较年轻的。但到目前为止,它已经在可敬的水平上工作,以便在一个例子的帮助下满足我们的需求。
我正在使用Email Approval using Google Script and a Form中的模板/示例。
我遇到的问题是,由于缺乏功能,在通过生成的电子邮件接受或拒绝时,我希望它能够将数据记录到最后的Google表格行中电子邮件生成的列。
我可能会在稍后添加第二个时间戳,回复电子邮件等。
那么那一行会显示填写的初始表格,然后空白/接受/拒绝作为状态。
感谢您的任何时间或帮助。
答案 0 :(得分:0)
James Ferreira最初撰写的审批工作流程是故意非常基本的。增强它以提供批准和原始请求之间的关联在概念上很简单,但由于细节和限制,使代码复杂化。
需要考虑的事情:
表单响应包括一个时间戳,我们可以将其用作响应的一种“序列号”,因为它在这样的应用程序中很有可能是唯一的。
我们可以将此标识符与批准电子邮件中嵌入的其余URL一起传递,然后将其作为参数返回给webapp.
在应用程序之间传递像时间戳这样的对象可能会很麻烦。为确保批准电子邮件中嵌入的URL有效,我们需要使用encodeURIComponent()
对时间戳的字符串表示进行编码,然后在webapp使用时对其进行解码。
使用Romain Vaillard 2D Array library中的ArrayLib.indexOf()
可以简化搜索匹配项。此函数将所有数组数据转换为字符串以进行比较,因此它非常适合我们的时间戳。
或者,我们可以努力创建一些“保证”唯一的其他标识符。
批准 - 响应网络应用(doGet()
)无法理解“activeSpreadsheet”的含义,即使它是电子表格中包含的脚本。这意味着我们需要一种方法来打开电子表格并记录审批结果。为了简化这个例子,我假设我们将使用一个常量,并为每个部署更新代码。 (伊克!)。
所以这是更好的费用审批工作流程脚本。
// Utilizes 2D Array Library, https://sites.google.com/site/scriptsexamples/custom-methods/2d-arrays-library
// MOHgh9lncF2UxY-NXF58v3eVJ5jnXUK_T
function sendEmail(e) {
// Response columns: Timestamp Requester Email Item Cost
var email = e.namedValues["Requester Email"];
var item = e.namedValues["Item"];
var cost = e.namedValues["Cost"];
var timestamp = e.namedValues["Timestamp"];
var url = ScriptApp.getService().getUrl();
// Enhancement: include timestamp to coordinate response
var options = '?approval=%APPROVE%×tamp=%TIMESTAMP%&reply=%EMAIL%'
.replace("%TIMESTAMP%",encodeURIComponent(e.namedValues["Timestamp"]))
.replace("%EMAIL%",e.namedValues["Requester Email"])
var approve = url+options.replace("%APPROVE%","Approved");
var reject = url+options.replace("%APPROVE%","Rejected");
var html = "<body>"+
"<h2>Please review</h2><br />"+
"Request from: " + email + "<br />"+
"For: "+item +", at a cost of: $" + cost + "<br /><br />"+
"<a href="+ approve +">Approve</a><br />"+
"<a href="+ reject +">Reject</a><br />"+
"</body>";
MailApp.sendEmail(Session.getEffectiveUser().getEmail(),
"Approval Request",
"Requires html",
{htmlBody: html});
}
function doGet(e){
var answer = (e.parameter.approval === 'Approved') ? 'Buy it!' : 'Not this time, Keep saving';
var timestamp = e.parameter.timestamp;
MailApp.sendEmail(e.parameter.reply, "Purchase Request",
"Your manager said: "+ answer);
// Enhancement: store approval with request
var sheet = SpreadsheetApp.openById(###Sheet-Id###).getSheetByName("Form Responses");
var data = sheet.getDataRange().getValues();
var headers = data[0];
var approvalCol = headers.indexOf("Approval") + 1;
if (0 === approvalCol) throw new Error ("Must add Approval column.");
// Record approval or rejection in spreadsheet
var row = ArrayLib.indexOf(data, 0, timestamp);
if (row < 0) throw new Error ("Request not available."); // Throw error if request was not found
sheet.getRange(row+1, approvalCol).setValue(e.parameter.approval);
// Display response to approver
var app = UiApp.createApplication();
app.add(app.createHTML('<h2>An email was sent to '+ e.parameter.reply + ' saying: '+ answer + '</h2>'))
return app
}
答案 1 :(得分:0)
所以,我试过这个,但是数据数组中的日期格式存在问题。为了使其工作,您必须使用formatDate重新格式化doGet中的时间戳。
我使用以下内容使其与数组中显示的格式匹配。
var newDate = Utilities.formatDate(new Date(timestamp),“PST”,“EEE MMM d yyyy HH:mm:ss'GMT'Z'(PST)'”);
最后,当然更新传递给newDate的indexof参数。