Apps Script Add-On onOpen (e), если показать меню или отправить по электронной почте - PullRequest
0 голосов
/ 03 января 2019

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

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

Спасибо всем, ктопомог.

Я работаю над созданием надстройки Google Apps Script, которая после установки в документе будет выполнять функцию отправки электронного письма эффективному пользователю каждый раз, когда документоткрыт.В настоящее время я делаю следующее:

function onInstall (e)
{
  onOpen (e)
}

function onOpen (e)
{
  if (/*Some Code*/)
  {
    DocumentApp.getUi().createAddonMenu()
      .addItem('Start Notification', 'myFunction')
      .addToUi();
  }

  else
  {
    myFunction ();
  }
}

В этом заявлении if я пробовал несколько разных вещей:

e.authMode == ScriptApp.AuthMode.NONE

, похоже, работал не совсем правильно, хотя ядействительно получило меню так, как было задумано, функция не выполнялась, когда кто-то другой открыл документ.Я думаю, это потому, что для них режим авторизации также НЕТ, поэтому он просто запускает if, а не else.Поэтому я попробовал это вместо этого:

e.authMode == ScriptApp.AuthMode.NONE && Session.getEffectiveUser().getEmail() == ""

Но это тоже не сработало.Опять же, я смог увидеть меню надстроек, и когда я нажал кнопку, чтобы активировать код, я могу убедиться, что «myFunction» действительно выполнялась, но не выполняла myFunction (), когда кто-то еще открыл документ.Я открыт для идей и предложений!

Вот myFunction ()

function myFunction() {
  var doc = DocumentApp.getActiveDocument().getName();
  var userEmail = Session.getEffectiveUser().getEmail();
  var openerEmail = Session.getActiveUser().getEmail();
  if (openerEmail != userEmail) {
     GmailApp.sendEmail(userEmail, doc + ' opened', openerEmail + " opened the document.");
  }
}

И еще одно дополнение, согласно второму полученному ответу: я изначально использовал этот код и вставил его во все свои документы.Поскольку он используется только для пользователей в моем домене, он работал отлично.Есть ли способ обойти это?

function myFunction() {
  var email = Session.getActiveUser();
  if (email != 'myEmail@domain.org') {
    GmailApp.sendEmail('myEmail@domain.org', 'Document opened', email + " opened your document.");
  }
}

function triggerBuilder ()
{
  var doc = DocumentApp.getActiveDocument();
  ScriptApp.newTrigger (myFunction)
    .forDocument(doc)
    .onOpen()
    .create();
}

Я бы просто запустил конструктор триггеров, чтобы сделать устанавливаемый триггер, или сделал бы это вручную.

Дополнительная информация: Я протестировалследуя коду, и обнаружил, что при запуске я смог увидеть информацию, когда сам открыл документ, а не когда это сделал кто-то другой.Кажется, что метод onOpen (e), возможно, вообще не работал, так как он также не отображался на странице Выполнения проекта.

function onInstall (e)
{
  onOpen (e);
}

function onOpen (e)
{
  if (Session.getEffectiveUser().getEmail() == "")
  {
    DocumentApp.getUi().createMenu("Notification Test")
      .addItem("Run function", 'myFunction')
      .addToUi();
  }
  else
    myFunction ();
}

function myFunction ()
{
  Logger.log ("This is verification that the document was opened.");
  Logger.log("Current user: " + Session.getActiveUser().getEmail());
}

Ответы [ 2 ]

0 голосов
/ 04 января 2019

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

В данный момент вы уже пытаетесь отправить электронное письмо, документирующее открытие каждого человека по электронной почте.Ограничения на onOpen предназначены именно для этой ситуации.У вас не должно быть доступа к чьему-либо адресу электронной почты просто потому, что они открыли вашу электронную таблицу, даже если они авторизуют ее - пользователю необходимо более осознанно взаимодействовать с вашей электронной таблицей, например открывать элемент меню, прежде чем вы сможете получить доступ к его информации.Ваши намерения могут быть добрыми, но представьте, что это установлено как дополнение.Лучшее, что вы можете сделать, - это зарегистрировать «пользовательский ключ» на консоли, используя Session.getTemporaryActiveUserKey(), что должно быть разрешено в режиме ограниченной авторизации.

Несколько расплывчатая документация с акцентом.

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

0 голосов
/ 04 января 2019

С Простые триггеры> Ограничения (выделено мной)

Они не могут получить доступ к службам, требующим авторизации.Например, простой триггер не может отправить электронное письмо , поскольку службе Gmail требуется авторизация, но простой триггер может перевести фразу с помощью службы Language, которая является анонимной.

Обходной путь - использовать устанавливаемый при открытом триггере вместо простого триггера.

Related

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...