App Maker:发送电子邮件、客户端脚本到服务器脚本功能不起作用。由于 属性 中的非法值而失败:a

App Maker: Sending Email, client script to server script function not working. Failed due to illegal value in property: a

我是 AppMaker 的新手,但我有开发经验。

该应用程序是项目跟踪器应用程序

我期望发生的事情:在创建项目时,用户使用用户选择器select 与该项目关联的用户。创建项目后,我想向与该项目关联的用户发送电子邮件。

问题:单击“添加”按钮时 addProject(addButton) 客户端脚本函数被调用。 在这个函数中调用 sendEmailToAssignees(project, assignees) 应该到达服务器脚本和 运行 notifyAboutProjectCreated(project, assignees) 但那没有发生。

须知:使用日志记录我从未访问过 'Trying to send email' 所以我似乎永远无法访问我的服务器脚本。此外,在客户端脚本上,当我注释掉 sendEmailToAssignees 功能时,一切 运行 都很顺利。我已将此文档视为一种资源,因此我觉得我的实现没问题。 https://developers.google.com/appmaker/scripting/client#client_script_examples

我得到的最后错误信息是:

Failed due to illegal value in property: 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);    

}

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

客户:

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
}

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