Ошибка с пустым полем в сценарии уведомления по электронной почте

Я прошу прощения. Я уверен, что это вопрос для новичков, на который есть простой ответ.

Поэтому я использую следующее, чтобы отправлять уведомление по электронной почте, когда пользователь создает запись. Все работает нормально, за исключением двух вариантов поведения, связанных с «нулевыми» (пустыми) записями.

function newSalesEmailMessage(sendButton) {
  var pageWidgets = sendButton.root.descendants;
  var fullName = app.datasources.CurrentUser.item.FullName;
  var htmlbody = '<b><font size="3">' + fullName + '</font></b>' + ' has created a new sales entry for: ' +  
      '<h1><span style="color:#2196F3">' + pageWidgets.ShowName.value  + '</h1>' +
      '<p>Shoot Date: <b>' + pageWidgets.ProjectDate.value.toDateString() + '</b>' +
      '<p>Contact: <b>' + pageWidgets.Contact.value + '</b>' +      
      '<p>Post AP: <b>' + pageWidgets.PostAP.value + '</b>' +
      '<p>Sales Person: <b>' + pageWidgets.SalesPerson.value + '</b>' +
      '<p>Notes: <b>' + pageWidgets.Notes.value + '</b>';



  google.script.run
    .withSuccessHandler(function() {
     })
    .withFailureHandler(function(err) {
      console.error(JSON.stringify(err));
    })
    .sendEmailCreate(
      '[email protected]',
      'New Sales Entry for: ' + pageWidgets.ShowName.value,
      htmlbody);
  return sendButton === "" || sendButton === null || sendButton === undefined;
}

Проблема 1: всякий раз, когда пользователь оставляет поле пустым, электронное письмо помещает в него «null», что имеет смысл, но люди продолжают спрашивать меня: «Кто является пустым?» Фу.

Так что, если есть способ вывести пробел (например: "") вместо "null", это было бы здорово.

Проблема 2: всякий раз, когда пользователь оставляет поле ProjectDate (которое является полем даты) пустым, я получаю сообщение об ошибке: не удается прочитать свойство toDateString со значением null.

Это имеет смысл, но, очевидно, из-за этого сценарий не завершается. Я надеялся, что что-то вроде этого исправит обе проблемы, но этого не произошло:

function newSalesEmailMessage(sendButton) {
  var pageWidgets = sendButton.root.descendants;
  if (pageWidgets === null) {
    pageWidgets = "";
  }
  var fullName = app.datasources.CurrentUser.item.FullName;
  var htmlbody = '<b><font size="3">' + fullName + '</font></b>' + ' has created a new sales entry for: ' +  
      '<h1><span style="color:#2196F3">' + pageWidgets.ShowName.value  + '</h1>' +
      '<p>Shoot Date: <b>' + pageWidgets.ProjectDate.value.toDateString() + '</b>' +
      '<p>Contact: <b>' + pageWidgets.Contact.value + '</b>' +      
      '<p>Post AP: <b>' + pageWidgets.PostAP.value + '</b>' +
      '<p>Sales Person: <b>' + pageWidgets.SalesPerson.value + '</b>' +
      '<p>Notes: <b>' + pageWidgets.Notes.value + '</b>';



  google.script.run
    .withSuccessHandler(function() {
     })
    .withFailureHandler(function(err) {
      console.error(JSON.stringify(err));
    })
    .sendEmailCreate(
      '[email protected]',
      'New Sales Entry for: ' + pageWidgets.ShowName.value,
      htmlbody);
}

Спасибо за помощь.


person Adam Bergeron    schedule 04.08.2017    source источник


Ответы (1)


Есть несколько способов справиться с такими ситуациями, самый простой - ввести несколько вспомогательных функций:

// This function will return empty string in case widget's value is null
// You can return any default value or even pass it as function's parameter
function getSafeString(widget) {
  return widget.value === null ?
         '' :
         widget.value;
}

function getSafeDate(widget) {
  return widget.value === null ?
         '' :
         widget.value.toDateString();
}

function newSalesEmailMessage(sendButton) {
...
'...some HTML...' + getSafeString(widgets.SomeWidget)  + '...some HTML...' +
'...some HTML...' + getSafeDate(widgets.DateWidget)  + '...some HTML...'
...
}

Кстати, я бы также предложил использовать datasource.item (или datasource.modes.create.item, в зависимости от ваших привязок), чтобы получать вводимые пользователем данные.

person Pavel Shkleinik    schedule 04.08.2017