Попытка поместить текущее имя пользователя в уведомление по электронной почте

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

Кнопка:

newSalesEmailMessage(widget);
widget.datasource.createItem();
app.closeDialog();

Код уведомления по электронной почте клиентского скрипта:

/**
 * Calls a server method to send an email.
 * @param {Widget} sendButton - widget that triggered the action.
 */
function newSalesEmailMessage(sendButton) {
  var pageWidgets = sendButton.root.descendants;
  var fullName = app.datasources.Directory.item.FullName;
  var htmlbody = '<b><font size="3">' + fullName + '</font></b>' + ' has created a new sales entry for: ' +  
      '<h1><span style="color:#2196F3">' +pageWidgets.ProjectName.value  + '</h1>' +
      '<p>Contact: <b>' + pageWidgets.Contact.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.ProjectName.value,
      htmlbody);
}

код onCreate для модели:

// onCreate
var email = Session.getActiveUser().getEmail();

var directoryQuery = app.models.Directory.newQuery();
directoryQuery.filters.PrimaryEmail._equals = email;
var reporter = directoryQuery.run()[0];

record.reported_by = email;
record.reported_full_name = reporter.FullName;
record.Date = new Date();

Все работает, кроме опции fullName. Он продолжает вытягивать мое имя, даже когда другой пользователь создает запись (может быть, потому что я администратор?). У меня есть настройка модели каталога, и, похоже, она работает, когда я показываю полное имя для комментариев пользователей.

Я хотел бы иметь fullName = имя человека, который в настоящее время создает запись.

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

Сценарий запуска приложения:

// App startup script
// CurrentUser - assuming that it is Directory model's datasource
// configured to load record for current user.
loader.suspendLoad();
app.datasources.Directory.load({
  success: function() {
    loader.resumeLoad();
  },
  failure: function(error) {
   // TODO: Handle error
  }
});

person Adam Bergeron    schedule 03.08.2017    source источник
comment
Можете ли вы добавить код вопроса, который вы используете для фильтрации/загрузки источника данных каталога? Я догадываюсь, что вы его вообще не фильтруете и ваша учетная запись самая первая запись в результатах...   -  person Pavel Shkleinik    schedule 04.08.2017
comment
Вы говорите о сценарии запуска приложения? Если это так, я добавил это к вопросу. (Спасибо)   -  person Adam Bergeron    schedule 04.08.2017


Ответы (2)


Вам необходимо отфильтровать источник данных модели каталога. Если вы планируете использовать его для разных целей, то я рекомендую создать выделенный источник данных для текущего пользователя. Вы можете отфильтровать его на сервере (предпочтительнее) или на стороне клиента:

Фильтровать на сервере, загружать на клиенте:

// Directory model's Server Script for Current User datasource
var query = app.models.Directory.newQuery();

query.filters.PrimaryEmail._equals = Session.getActiveUser().getEmail();

return query.run();

// ------------------------
// Your startup script will remain almost the same:
loader.suspendLoad();
app.datasources.CurrentUser.load({
  success: function() {
    loader.resumeLoad();
  },
  failure: function(error) {
   // TODO: Handle error
  }
});

Только для клиента:

var currentUserDs = app.datasources.CurrentUser;

currentUserDs.query.filters.PrimaryEmail._equals = app.user.email;

loader.suspendLoad();
currentUserDs.load({
  success: function() {
    loader.resumeLoad();
  },
  failure: function(error) {
   // TODO: Handle error
  }
});
person Pavel Shkleinik    schedule 03.08.2017
comment
Это сработало отлично. Ответил на подробные шаги для тех, кто может захотеть повторить мои шаги. Спасибо за помощь. - person Adam Bergeron; 04.08.2017

Спасибо Павлу. Все работало, но мне потребовалось несколько времени, чтобы понять, что именно мне нужно делать. Для тех, кто хочет попробовать повторить то, что я сделал, были шаги.

Сначала мне пришлось создать модель каталога.

Затем в разделе «Настройки приложения» для самого приложения (щелкните шестеренку) я поместил следующий код в раздел Сценарий запуска приложения — клиентский сценарий:

loader.suspendLoad();
app.datasources.CurrentUser.load({
  success: function() {
    loader.resumeLoad();
  },
  failure: function(error) {
   // TODO: Handle error
  }
});

Затем я перешел в раздел «Источники данных» для модели каталога и добавил источник данных с именем CurrentUser.

В разделе Query — Server Script я указал:

var query = app.models.Directory.newQuery();

query.filters.PrimaryEmail._equals = Session.getActiveUser().getEmail();

return query.run();

Это фильтрует источник данных, так что единственной записью в нем является текущий пользователь. Затем я изменил свой «var fullName» в клиентском скрипте электронной почты, чтобы он указывал на новый источник данных:

/**
 * Calls a server method to send an email.
 * @param {Widget} sendButton - widget that triggered the action.
 */
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.ProjectName.value  + '</h1>' +
      '<p>Contact: <b>' + pageWidgets.Contact.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.ProjectName.value,
      htmlbody);
}
person Adam Bergeron    schedule 04.08.2017