Разширете потребителския интерфейс на Google Spreadsheets с Google Web App

Създадох скрипт за 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 трябва да създаде елемент от менюто, когато се щракне върху елемента, се извиква Бинго.   -  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 Благодаря ти Serge, работи. Това решение обаче може да има своите недостатъци, ще видим...   -  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