Как я могу использовать библиотеку, которая отображает черновики и отправляет электронную почту в проект, связанный с контейнером? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть 2 скрипта Google Apps Проекты .

  1. SheetsLib - это библиотека, которую я создал, она содержит мои go -функции.
  2. TestFile - это связанный с контейнером скрипт, который использует SheetsLib.

SheetsLib содержит следующие функции, которые имеют отношение к этому вопросу:

  1. displayDraftsSelector - отображает страница draftSelector Html на боковой панели.
  2. draftSelector - Html файл, который также содержит сценарий js, который вызывает внутреннюю функцию для заполнения <select>
  3. getDraftsArr - Серверная функция, которая возвращает все черновики Gmail от пользователя.

Функции SheetsLib работают, т.е. у меня есть тестовые функции, чтобы подтвердить это. Моя цель - улучшить эту библиотеку, чтобы я мог использовать ее в нескольких проектах с функциональностью, позволяющей пользователю выбирать существующий черновик Gmail и отправлять его выбранным пользователям (в активной электронной таблице).

ПРОБЛЕМА В моем новом сценарии с привязкой к контейнеру, который имеет доступ к библиотеке, я могу отображать только боковую панель, но не вызывать внутреннюю функцию (которая находится в библиотеке), когда я нажимаю кнопку на боковой панели:

  1. Я успешно загружаю представление, используя displayDraftsSelector(), которое показывает представление draftSelector. Это все функции библиотеки.
  2. Затем представление вызывает getDraftsArr(), и это вызывает ошибку. Но эта функция существует в библиотеке (и работает по назначению).

Следующая ошибка, которую я вижу в консоли при загрузке боковой панели:

Uncaught TypeError: google.script.run.withSuccessHandler (...). WithFailureHandler (...). GetDraftsArr не является функцией

В идеале должно произойти то, что внутренняя функция * Вызывается 1043 *, и его результат заполняет элемент выбора. Затем пользователь может выбрать один черновик на боковой панели. Когда пользователь подтверждает с помощью кнопки, активные строки являются получателями. В целом, все это работает, когда я копирую-> вставляю, но не могу понять, как сохранить функциональность в библиотеке.

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

    // back-end in Library Project
    function getDraftsArr(){
      let output = [];
      const messages = GmailApp.getDraftMessages();
      
      messages.forEach( message => {  
        output.push({
          id: message.getId(),
          subject: message.getSubject()
        });
      });
      
      return JSON.stringify(output)  
    }

Следующее находится в бэкэнде библиотеки

    // front-end in Library Project    
    <select id="draftsSelect"></select>
 
    <script>
    function getDrafts(){
    const draftsSelect = document.getElementById("draftsSelect");
    google.script.run
      .withSuccessHandler( updateDrafts )
      .getDraftsArr();         
              
    function updateDrafts( drafts ){                
      var options = "";
      var draftsParsed = JSON.parse(drafts);        
                  
      draftsParsed.forEach( draft => {                   
        options += "<option value='" + draft.id + "'>" + draft.subject + "</option>";
      });
      draftsSelect.innerHTML = options;        }                          
    }
    </script>

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Спасибо @ Rubén за ссылку на это: stackoverflow.com/q/59271952/1595451

В основном решение состояло в том, чтобы создать функцию в моем скрипте-контейнере с тем же именем, что и серверная часть. функции, которые находятся в библиотеке, которые затем вызывают библиотеку.

Итак, в моей библиотеке у меня раньше было getDraftsArr(){}, а теперь я добавил следующее в свой проект, связанный с контейнером:

function getDraftsArr(){
  return SheetsLib.getDraftsArr()
}

Это сработало.

0 голосов
/ 21 июня 2020

Если вы можете создать фиктивную функцию. Затем создается фиктивная функция:

function executeLibraryFunctionsByName(funcname) {
  libraryname[funcname]();
}

Эта функция позволит вам вызывать все функции вашей библиотеки по имени. Я не уверен, что это сработает, если в имени вашей библиотеки есть пробел. В таком случае измените его имя. Примечание: не ставьте кавычки вокруг имени библиотеки. Просто напишите имя библиотеки без кавычек, и я бы избегал пробелов, и оно становится 'this' для вашей функции.

В качестве примера у меня есть библиотека xyzSUS1, и я могу использовать такую ​​кнопку:

<input type="button" value="test" onClick="google.script.run.callLibraryFunctionsByName('selectColumnsSkipHeader');" />

на моей боковой панели для запуска библиотечной функции xyzSUS1.selectColumnsSkipHeader ().

команда в объявлении функции в моем коде gs следующая:

function callLibraryFunctionsByName(funcname) {
  xyzSUS1[funcname]();//the this for funcname because xyzSUS1
}
...