Запуск showSidebar в onOpen (надстройка Google Docs)

#google-apps-script #google-docs

#google-apps-script #google-docs

Вопрос:

Я создаю надстройку Docs с помощью скрипта Apps и вызываю showSidebar() из onOpen().

Когда я просматриваю журналы, он просто показывает «ошибка», напечатанную несколько раз, и не открывает боковую панель. Можно ли вызвать showSidebar() из функции onOpen()?

Отдельно я пытаюсь зарегистрировать электронную почту пользователя из onOpen() с помощью Session.getActiveUser().getEmail() и вижу, что она там не имеет значения. Но у него есть значение в showSidebar().

Я предполагаю, что я не понимаю разрешения с помощью скрипта приложений, кто-нибудь еще знает?

Комментарии:

1. Попробуйте использовать устанавливаемый onOpen ()

Ответ №1:

На основе Session.getActiveUser(),

  • Если политики безопасности не разрешают доступ к идентификатору пользователя, User.getEmail() возвращает пустую строку.
  • адрес электронной почты пользователя недоступен в любом контексте, который позволяет запускать скрипт без авторизации этого пользователя, например, простой триггер onOpen (e) или onEdit (e), пользовательская функция в Google Sheets или веб-приложение, развернутое для «выполнения от моего имени» (то есть с авторизациейразработчик вместо пользователя)

Следовательно, вам необходимо использовать устанавливаемый триггер, который может вызывать службы, требующие авторизации.


Чтобы вручную создать устанавливаемый триггер:

введите описание изображения здесь

Пример конфигурации:

введите описание изображения здесь


Пример кода:

Code.gs

 function onOpen(e) {
  showSidebar();

  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var email = e.user.getEmail();
  body.appendParagraph(email);
  body.appendParagraph(Session.getActiveUser().getEmail());

}

function showSidebar() {
  var html = HtmlService.createHtmlOutputFromFile('Page')
      .setTitle('My custom sidebar');
  DocumentApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
      .showSidebar(html);
}

function getActiveUser(){
  var email = Session.getActiveUser().getEmail(); 
  Logger.log(email);
  return email;
};
 
  • Я использовал 2 разных способа получить активного пользователя: 1.) С помощью объекта события onOpen() e.user.getEmail() и 2.) Использование Session.getActiveUser().getEmail() .
  • Оба варианта могли отображать электронную почту активного пользователя, как показано в документе, где электронная почта была добавлена в качестве абзаца.

Page.html

 <!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  </head>
  <body>
    
    <div id="rangeResult"></div>
    <script>
    function addRange(rangeStartEnd){ 
      $('#rangeResult').text(rangeStartEnd);
    };
    
    google.script.run.withSuccessHandler(addRange).getActiveUser();
    </script>    
  </body>
</html>
 

Вывод:

введите описание изображения здесь