首页 > 解决方案 > 应用程序制造商:发送电子邮件、客户端脚本到服务器脚本功能不起作用。因财产非法价值而失败: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);    

}

标签: google-app-maker

解决方案


您收到此错误的原因是您试图将客户端“项目记录”传递给服务器。如果您需要访问项目,则将记录密钥传递给服务器,然后使用密钥访问服务器上的记录。

客户:

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
}

客户端的项目记录对象与服务端的项目记录对象不一样;因此非法属性值错误。


推荐阅读