Вопрос:
Когда я создаю скрипт в электронной таблице с помощью UiApp, у меня есть кнопка с обработчиком сервера, которая заканчивается подчеркиванием. Если я запустил скрипт из электронной таблицы, тогда он отлично работает, но если я добавлю этот проект в другой лист и запустил его, тогда я получу ошибку, говоря, что функция скрипта не найдена. У него нет проблем с поиском функций, которые заканчиваются символом подчеркивания, когда они используются в коде, это похоже на то, когда они вызываются из обработчика сервера.
Чтобы воспроизвести:
Создать новую таблицу
Вставьте код:
function buildForm() { var app = UiApp.createApplication(); // show that calling a function ending in underscore works var labelText = getLabelText_(); app.add(app.createLabel(labelText).setId(«label»)); var handler = app.createServerHandler(«clickHere_»); app.add(app.createButton(«Click Here»,handler)); var ss = SpreadsheetApp.getActiveSpreadsheet(); ss.show(app); } // This is just to show that underscore on the end works as long as it is not a server handler function getLabelText_() { return «label text»; } // called from server handler function clickHere_(e) { var app = UiApp.getActiveApplication(); app.getElementById(«label»).setText(«You clicked there»); return app; }
Запустите код и убедитесь, что он работает как ожидалось
Создайте еще одну таблицу, добавьте первую таблицу в виде библиотеки и назовите ее MyCode. Убедитесь, что вы сохранили версию и т.д.
В новой таблице введите код:
function runIt() { MyCode.buildForm() }
Запустите этот код, обратите внимание, что getLabelText_() работает отлично, и пользовательский интерфейс создается, но при нажатии кнопки появляется ошибка, которая не найдена.
Если я удалю символ подчеркивания с помощью щелчкаHere_ (e) и соответствующим образом изменим обработчик сервера, то он будет работать.
Единственное решение для удаления подчеркивания с конца всех функций, вызываемых обработчиком сервера?
Лучший ответ:
Это необходимый формат для библиотеки сценариев приложений Google:
https://developers.google.com/apps-script/guide_libraries#writingLibrary
Это предназначено для выполнения частных функций.
РЕДАКТИРОВАТЬ:
как говорится в документации:
Если вы хотите, чтобы один или несколько методов вашего сценария не были видимыми (и не использовались) для пользователей вашей библиотеки, вы можете закончить имя метода с помощью подчеркивания. Например, myPrivateMethod_()
В качестве “функции библиотеки” function buildForm() может вызывать function getLabelText_() которая также находится в этой библиотеке. Но вы не можете напрямую вызвать function getLabelText_() из скрипта, используя библиотеку. Ни один ваш скрипт не имеет права напрямую вызвать function clickHere_(e).
Поэтому при использовании в качестве обработчика сервера функция clickHere_(e) вызывается из скрипта не из библиотеки, и это не сработает. Чтобы вызвать эту функцию, вы должны удалить “_” в конце ее и вызвать ее так: libraryName.libraryFunction();