google-app-maker - 应用程序制造商:发送电子邮件、客户端脚本到服务器脚本功能不起作用。因财产非法价值而失败:a
问题描述
我是 AppMaker 的新手,但我有开发者经验。
该应用程序是一个项目跟踪器应用程序
我期望发生的事情:创建项目时,用户使用用户选择器来选择与该项目关联的用户。创建项目后,我想向与该项目关联的用户发送电子邮件。
问题:单击添加按钮时addProject(addButton)
调用客户端脚本函数。在这个函数内部sendEmailToAssignees(project, assignees)
被调用,它应该到达服务器脚本并运行notifyAboutProjectCreated(project, assignees)
但没有发生。
要知道的事情:通过日志记录,我永远不会到达“尝试发送电子邮件”,所以我似乎永远不会到达我的服务器脚本。此外,当我注释掉sendEmailToAssignees
函数时,在客户端脚本上一切运行顺利。我已将此文档视为资源,因此我觉得我的实现还可以。https://developers.google.com/appmaker/scripting/client#client_script_examples
我得到的最后一条错误消息是:
由于属性中的非法值而失败:a at addProject (AddProject:110:24) at AddProject.Container.PanelAddProject.Form1.Spring.ButtonAdd.onClick:1:1
我在这里错过了什么吗?任何帮助将不胜感激。谢谢!
客户端脚本
function sendEmailToAssignees(project, assignees) {
google.script.run
.withSuccessHandler(function() {
console.log('Sending Email Success');
}).withFailureHandler(function(err) {
console.log('Error Sending Email: ' + JSON.stringify(err));
})
.notifyAboutProjectCreated(project, assignees);
}
function addProject(addButton) {
if (!addButton.root.validate()) {
return;
}
addButton.datasource.createItem(function(record) {
var page = app.pages.AddProject;
var pageWidgets = page.descendants;
var trainees = pageWidgets.AssigneesGrid.datasource.items;
var traineesEmails = trainees.map(function(trainee) {
return trainee.PrimaryEmail;
});
record.Assignee = traineesEmails.toString();
var assignees = traineesEmails.toString();
var project = record;
updateAllProjects(record);
console.log('update all projects done');
sendEmailToAssignees(project, assignees);
console.log('Send Email done');
if (app.currentPage !== app.pages.ViewProject) {
return;
}
gotoViewProjectPageByKey(record._key, true);
});
gotoViewProjectPageByParams();
}
服务器脚本
function notifyAboutProjectCreated(project, assignees) {
console.log('Trying to send email');
if (!project) {
return;
}
var settings = getAppSettingsRecord_()[0];
if (!settings.EnableEmailNotifications) {
return;
}
var data = {
appUrl: settings.AppUrl,
assignee: project.Assignee,
owner: project.Owner,
startDate: project.StartDate,
endDate: project.EndDate,
jobType: project.Type,
jobId: project.Id
};
// Email Subject
var subjectTemplate = HtmlService.createTemplate(settings.NotificationEmailSubjectJob);
subjectTemplate.data = data;
var subject = subjectTemplate.evaluate().getContent();
// Email Body
var emailTemplate =
HtmlService.createTemplate(settings.NotificationEmailBodyJob);
emailTemplate.data = data;
var htmlBody = emailTemplate.evaluate().getContent();
console.log('About to send email to:', assignees);
sendEmail_(null, assignees, subject, htmlBody);
}
解决方案
您收到此错误的原因是您试图将客户端“项目记录”传递给服务器。如果您需要访问项目,则将记录密钥传递给服务器,然后使用密钥访问服务器上的记录。
客户:
function sendEmailToAssignees(project, assignees) {
var projectKey = project._key;
google.script.run
.withSuccessHandler(function() {
console.log('Sending Email Success');
}).withFailureHandler(function(err) {
console.log('Error Sending Email: ' + JSON.stringify(err));
})
.notifyAboutProjectCreated(projectKey , assignees);
}
服务器:
function notifyAboutProjectCreated(projectKey, assignees) {
console.log('Trying to send email');
var project = app.models.<PROJECTSMODEL>.getRecord(projectKey);
if (!project) {
return;
}
//Rest of the logic
}
客户端的项目记录对象与服务端的项目记录对象不一样;因此非法属性值错误。
推荐阅读
- jvm - JVM 生态系统 AOT 编译目前有哪些选项
- css - CSS Grid minmax - 需要验证,请
- javascript - 为什么它说“(函数)已定义但值从未被读取”?
- javascript - 为什么 text() 和样式。宽度在 Js 中不起作用?
- python - 如何获得 keras 变压器模型中的时期数
- github - 在 github repo 页面上创建自定义选项卡
- javascript - 如何用新的html元素动态替换旧的html元素
- python - set 类型的对象不是 JSON 可序列化的
- apache-kudu - apache kudu 平板服务器未启动
- android - Android Studio 布局如何在 EdiText 之前进行提示/提示