2014-02-02 5 views
1

Я создал скрипт Google Apps, и у меня есть вопрос о передаче переменной обработчику кликов. Сценарий публикуется как веб-приложение и доступен по ссылке HTML по электронной почте (форма одобрения/отклонения для бизнес-запроса). Когда кто-то отправляет форму, электронное письмо отправляется соответствующему лицу, который при нажатии на ссылку одобрения. Эта ссылка содержит следующие переменные:Переменная скрипта Google Script для Click Handler

?status=enteredInCC&rowNum=9

Так что, когда они нажимают на ссылку скрипт запущен, и он входит в function doGet(e) блок и в соответствующих случаях код:

var app = UiApp.createApplication(); 
var grid = app.createGrid(1, 2); 
var label = app.createLabel('Please enter the item\'s PLU:') 
var input = app.createTextBox().setId("input").setName("input"); 
grid.setWidget(0, 0, label); 
grid.setWidget(0, 1, input); 
var handler = app.createServerHandler("retrieveInput").addCallbackElement(input); 
var button = app.createButton("OK", handler); 
var panel = app.createVerticalPanel().setId("panel") 
panel.add(grid); 
panel.add(button); 
app.add(panel); 

return app; 

Что приводит к обработчик кликов:

function retrieveInput(e){ 
    var input = e.parameter.input; 
    var app = UiApp.getActiveApplication(); 
    var panel = app.getElementById('panel'); 

    panel.clear(); 

    app.add(app.createHTML('<h2>The request has been updated. You can close this window.</h2>')) 
    app.close() 
    return app; 
} 

И все это отлично работает. Однако ранее в функции doGet(e) некоторая информация была собрана из URL-адреса и хранилась в переменных. Теперь в retrieveInput(e) Мне нужно получить доступ к этим переменным, чтобы внести некоторые обновления в электронную таблицу (сразу после panel.clear()). Есть идеи?

ответ

1

Сохранение в переменных не будет работать, потому что функция retrieveInput вызывается в новом/другом «экземпляре» вашего сценария, поэтому не может обращаться к переменным, установленным в doGet. В вашем случае я предлагаю вам сохранить нужные параметры в виде скрытых входов в panel и использовать его как callbackElement, а не только input. Как это:

function doGet(e) { 
    var app = UiApp.createApplication(); 
    var panel = app.createVerticalPanel().setId("panel") 
    panel.add(app.createHidden('status', e.parameter.status)); 
    panel.add(app.createHidden('rowNum', e.parameter.rowNum)); 
    var grid = app.createGrid(1, 2); 
    var label = app.createLabel('Please enter the item\'s PLU:') 
    var input = app.createTextBox().setId("input").setName("input"); 
    grid.setWidget(0, 0, label); 
    grid.setWidget(0, 1, input); 
    var handler = app.createServerHandler("retrieveInput") 
    .addCallbackElement(panel); //changed to panel instead of input 
    var button = app.createButton("OK", handler); 
    panel.add(grid).add(button); 
    return app.add(panel); 
} 

Затем вы можете использовать e.parameter.status и другие, как правило, в retrieveInput(e).

+0

Работал как очарование. Спасибо. – MSCF