Apps Script - модальное шоу и google.script.run из привязанного к библиотеке - PullRequest
1 голос
/ 12 апреля 2020

У меня есть электронная таблица с ограниченным скриптом, которая объединяет библиотеку. Эта библиотека предоставляет 2 функции:

  • Показ мод html с кнопкой
  • Предоставляет функцию обратного вызова при нажатии кнопки на html

Содержимое БИБЛИОТЕКИ:

test.html

<!DOCTYPE html>
<html>
  <head>  
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">     
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
  </head>
  <body>

   <a class="waves-effect waves-light btn" onclick="runButtonFunction()">My Button</a>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
    <script>
    function onSuccess() {
       console.log("onSuccess");
    }
    function onFailure(error) {
       console.error("onFailure"); 
       console.error(error);  
    }
    function runButtonFunction() {
       console.log("runButtonFunction");  
       google.script.run
         .withFailureHandler(onFailure)
         .withSuccessHandler(onSuccess)
         //.callbackTestInBounded();
         .callbackTestInLibrary();
    }
    </script>
  </body>
</html>

success.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <p>SUCCESS!</p>
  </body>
</html>

script.gs

function showModal() {
  console.info("execute showModal");
  var html = HtmlService.createHtmlOutputFromFile('test.html');
  SpreadsheetApp.getUi().showModalDialog(html, 'Test')
}

function callbackTestInLibrary() {
  console.info("callbackTest");
  htmlCallback();
}

function htmlCallback() {
  console.info("execute htmlCallback");
  var html = HtmlService.createHtmlOutputFromFile('success.html');
  SpreadsheetApp.getUi().showModalDialog(html, 'Test')
}

И ОГРАНИЧЕНО content

function onOpen() {
  SpreadsheetApp.getUi().createMenu("TEST").addItem("show modal", "openModal").addToUi();
}

function openModal() {
  console.info("execute openModal");
  TestLibrary.showModal();
}

function callbackTestInBounded() {
  console.info("execute callbackTest");
  TestLibrary.htmlCallback();
}

function callbackTestInLibrary() {
  // Empty, only for make it works
}

Пока открытый модал работает нормально, окно html отображается без проблем, у меня возникают некоторые проблемы с обратным вызовом при нажатии кнопки.

Моя гипотеза о том, почему сейчас не работает, связана с изменением среды выполнения V8, так как в прошлом я всегда создавал html модальные функции, которые запускают функции, которые объявлены внутри ограниченного скрипта , теперь это не так кажется, то же самое.

TEST # 1

Если я объявлю фактическую функцию обратного вызова callbackTestInBounded внутри ограниченного скрипта, а в HTML я использую google.script.run.callbackTestInBounded();, я получаю такое поведение: «Uncaught error» в консоли Chrome, enter image description here

и если я вижу X Ответ HR Я получаю это:

)]}'

[["op.exec",null,[1,[]
,"Script function not found: callbackTestInBounded","ScriptError"]
]
,["di",377,null,null,null,null,[]
,[]
,null,null,[]
,[]
,[]
]
]

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

TEST # 2

Я переключил html на вызов google.script.run.callbackTestInLibrary();, и, нажав кнопку, я получаю это:

userCodeAppPanel:15 Uncaught TypeError: google.script.run.withFailureHandler(...).withSuccessHandler(...).callbackTestInLibrary is not a function
    at runButtonFunction (userCodeAppPanel:15)
    at HTMLAnchorElement.onclick (userCodeAppPanel:1)

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

HTML

google.script.run.callbackTestInLibrary();

BOUNDED

function callbackTestInLibrary() {
  // Empty, only for make it works
}

БИБЛИОТЕКА (то же имя, что и ограниченное)

// The actual implementation of the function
function callbackTestInLibrary() {
  console.info("callbackTest");
  htmlCallback();
}

При всем этом отображается второй HTML:

enter image description here

Требуется ли это новый тип конфигурации для среды выполнения V8, когда Есть сценарий, где html и скрипт-обратный вызов наследуются от библиотеки? Этого следовало ожидать?

...