Расширение пользовательского интерфейса электронных таблиц Google с помощью веб-приложения Google

Я создал сценарий для таблиц Google, этот сценарий просто добавляет новый пункт меню, как описано здесь Пользовательское меню Элементы в электронной таблице. Затем я развертываю этот сценарий как веб-приложение и хочу, чтобы все пользователи, устанавливающие приложение, могли видеть новый пункт меню. И я застрял на этом этапе.

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

Вот мой код:

function doGet() {
    var newSheet = SpreadsheetApp.create("new sheet");
    var newId = newSheet.getId();
    ScriptProperties.setProperty('newId', newId); 

    ScriptApp.newTrigger("myOnOpen")
        .forSpreadsheet(newId)
        .onOpen()
        .create();
};

function myOnOpen() {
    var newId = ScriptProperties.getProperty('newId');
    var sheet = SpreadsheetApp.openById(newId);

    var entries = [ { name : "Show bingo", functionName : "Bingo" } ];
    sheet.addMenu("My Menu", entries);
};

function Bingo() {
    Browser.msgBox("Bingo!");
};

Итак, когда пользователь, установивший приложение, открывает электронную таблицу «новый лист», он не видит «Мое меню». Что я здесь делаю не так? Почему пункт меню не отображается? В конце концов, я хочу создать веб-приложение, которое расширяет пользовательский интерфейс Google Spreadsheets дополнительными меню и диалоговыми окнами.

Любые советы приветствуются. Спасибо!


person xman85    schedule 17.12.2012    source источник
comment
Я не могу понять, как функция Bingo может оказаться в скрипте новой электронной таблицы ... я не могу и для функции myonopen ... как вы себе представляете этот процесс? Я считаю, что это просто невозможно ... почему бы не создать шаблон с уже включенным скриптом и после этого не создать триггер? Не могли бы вы уточнить? Мне действительно любопытно ...   -  person Serge insas    schedule 18.12.2012
comment
@Sergeinsas Когда пользователь запускает приложение, в его GDrive создается настраиваемый триггер. Триггер прикреплен к конкретной электронной таблице в GDrive пользователя. Каждый раз, когда пользователь открывает эту электронную таблицу, вызывается myOnOpen. Это работает, я создал тестовую учетную запись, установил свое приложение, открыл новый лист, был вызван myOnOpen. Я даже могу до некоторой степени изменить электронную таблицу из функции myOnOpen (например, sheet.setColumnWidth(1, 200)), но я не могу создавать там пользовательские меню. Шаблон не работает для меня, я хочу, чтобы пользователи загружали свои файлы .xls, и я хочу добавить пользовательский интерфейс для редактирования этих файлов.   -  person xman85    schedule 18.12.2012
comment
Как вы проверили, что myonOpen запускается, когда пользователь открывает SS? А как могло работать Бинго? у него нет связи с таблицей ... Это не соответствует сценарию и определению контейнера.   -  person Serge insas    schedule 18.12.2012
comment
@Sergeinsas Я использовал MailApp.sendEmail(). myOnOpen должен создать элемент меню, при щелчке по элементу запускается Bingo.   -  person xman85    schedule 18.12.2012
comment
То, что вы объясняете о том, что пользователи загружают свои файлы .xls, - это не та же ситуация, что и создание новых файлов, как в вашем тесте ... шаблоны также будут работать, просто используйте сценарий для копирования импортированных данных xls (в google ss) в копию шаблона, и все готово, к копии шаблона будет прикреплен скрипт, и вы можете добавить триггеры так же, как вы это делаете сейчас ...   -  person Serge insas    schedule 18.12.2012
comment
Спасибо за объяснения ;-) Мне все еще интересно, как это может работать, но я перестану вас спрашивать ... удачи   -  person Serge insas    schedule 18.12.2012
comment
@Sergeinsas Это может сработать, если копирование данных из .xls в шаблон не является утомительным процессом. Могу я сделать это с помощью пары простых вызовов API? Не могли бы вы указать мне на какую-нибудь документацию по этому поводу?   -  person xman85    schedule 18.12.2012
comment
Это довольно просто; используйте sheet.copyTo (), используя xls import ss в качестве источника и шаблона скопируйте в качестве места назначения, сделайте это для каждого листа в цикле и все.   -  person Serge insas    schedule 18.12.2012
comment
@Sergeinsas Спасибо, Серж, работает. У этого решения могут быть свои недостатки, посмотрим ...   -  person xman85    schedule 19.12.2012
comment
рад, что это помогло, это был длинный комментарий, извиняюсь за сто ;-)   -  person Serge insas    schedule 19.12.2012


Ответы (1)


Когда вы развертываете скрипт как веб-приложение, пользователи веб-приложения будут видеть только контент, который вы «возвращаете» из функции doGet. Вы можете создавать контент с помощью UiApp или HtmlService и вернуть это содержимое для отображения в браузере. Ваши новые элементы меню прикрепляются к электронной таблице, поэтому они могут отображаться только тогда, когда пользователь переходит к самой электронной таблице (активация триггера onOpen и т. Д.).

person Kalyan Reddy    schedule 17.12.2012
comment
В моем сценарии происходит следующее: пользователь устанавливает приложение, после того как пользователь открывает вновь созданный новый лист в своем GDrive, функция myOnOpen запускается, но меню не добавляется. - person xman85; 18.12.2012