在已完成的表单中创建指向记录的链接



我是App Maker的新手。 我有一个用户填写的表单,称为CreditApplication(它的链接数据源也称为CreditApplication(。
此表单有一个"提交"按钮。提交后,我希望通过电子邮件将一封电子邮件发送给其他用户,其中包含指向刚刚完成的记录的链接。

我在创建此链接时遇到问题。 我希望该链接将通过电子邮件发送的用户带到信用申请表中的同一记录。 我在下面列出了我所拥有的内容。

信用申请表有一个提交按钮,其中 onClick 设置为:

createRequest(widget).

CreditApplication数据源在onCreate事件中具有以下代码:

var to = "jdoe@gmail.com";
var subject = "New Online Credit Application Submission - " + record.FirstName + " (Sales Contact: " + record.SalesContact + ")";
var msg = "A credit application has been submitted for " + record.FirstName + "." + "<br><br>";
var appUrl = ScriptApp.getService().getUrl() + '#CreditApplication?requestId=' + record._key;
msg = msg + appUrl;
MailApp.sendEmail(to, subject, msg, {htmlBody: msg});   

我的客户端javascript代码位于一个名为ClientScripts的库中,如下所示:

/**
* Replaces the url history state to reflect the changes upon navigation
*     from a different screen.
* @param {String} requestId - id of the selected request.
*/
function replaceUrlForReadRequest(requestId) {
var params = {
requestId: requestId
};
google.script.history.replace(null, params, app.pages.NewPage1.name);
}
/**
* Replaces the url history state to reflect the changes upon navigation
*     from a different screen.
* @param {Page} page - application page to navigate.
*/
function replaceUrlForPage(page) {
var params = {};
google.script.history.replace(null, params, page.name);
}
/**
* Creates a new request and redirects user to the read screen afterwards.
* @param {Widget} submitButton - button that triggers the action.
*/
function createRequest(submitButton) {
if (!submitButton.root.validate()) {
return;
}
var NewPage1 = app.pages.NewPage1;
submitButton.datasource.createItem(function(record) {    
if (app.currentPage === NewPage1) {
replaceUrlForReadRequest(record._key);     
}
});  
app.showPage(NewPage1);
replaceUrlForPage(NewPage1);
}

您可以添加一个 URL 参数,用于在通过电子邮件发送 URL 之前标识记录。当用户检索页面时,使用该参数调整查询筛选器以加载记录。

可以通过客户端脚本将 URL 参数添加到 URL:

/**
* Adds a URL parameter.
* @param {string} name - name of the URL parameter;
* @param {string} value - value of the URL parameter;
*/
function addUrlParameter(name, value) {
google.script.url.getLocation(function(location) {
var params = location.parameter;
if (params[name]) {
console.log('URL parameter already exists');
} else {
console.log('Adding URL parameter');
params[name] = value;
google.script.history.replace({}, params);
}
});
}

下面是 onAttach 事件处理程序的示例。"项目"是数据源的名称。它使用内置数据字段"Key"来设置查询筛选器。

/**
* Loads a record based on the "key" parameter in URL.
*/
function loadPageByKey() {
google.script.url.getLocation(function(location) {
if ('key' in location.parameter) {
var datasource = app.datasources.Project;
datasource.query.clearFilters();
datasource.query.filters.Key._equals = location.parameter.key;
datasource.load(function() {
datasource.query.clearFilters();
});
}
});
}

一般来说,你的代码看起来不错,但是...:

// onCreate - actually it is onBeforeCreate
...
var appUrl = ScriptApp.getService().getUrl() +
'#CreditApplication?requestId=' +
record._key;
...

实际上,它是在创建模型事件之前,此时尚未设置"_key"属性...我有一种感觉,应用制作工具应该在最近的时间内解决这个问题。

同时。。。您可以调整应用程序工作流或使用其他字段进行导航。例如,您可以为新记录生成 id...

// onCreate - workaround for missing onAfterCreate model event
...
record.UniqueId = customFunctionToGenerateUniqueId();
var appUrl = ScriptApp.getService().getUrl() +
'#CreditApplication?requestId=' +
record.UniqueId;
...

最新更新