2014-12-27 10 views
0

Я могу захватить переменную с URL-адреса опубликованного сценария приложения, но я не уверен, как передать эту переменную другой функции. В приведенном ниже скрипте не будет запущена функция onRun, если включена переменная. Моя цель - передать 2 переменные, но по одной проблеме одновременно.Как передать параметр doGet (e) другой функции?

function doGet(e) { 

    var id = e.parameter.id; 
    var minutes = e.parameter.min; 


    var html = '<p>' 
    +'<button onClick=google.script.run.onRun('+id+')>Run</button>' // Does not work when clicked 
    +'<button onClick=google.script.run.onRun()>Run without parameter</button>' 
    +'<button onClick=google.script.run.turnOn()>On</button>' 
    +'<button onClick=google.script.run.turnOff()>Off</button>' 
    +'</p>'; 

    return HtmlService.createHtmlOutput(html).setSandboxMode(HtmlService.SandboxMode.IFRAME); 

} 

function onRun(id){ 
    Logger.log("id: "+id); 
} 

ответ

1

Либо используйте глобальную переменную, либо поместите значения в кеш.

Чтобы объявить глобальную переменную, объявите переменную вне функции:

var id = ""; 
var minutes = ""; 

function doGet(e) { 

    id = e.parameter.id; 
    minutes = e.parameter.min; 

    var html = . . . . . HTML HERE; 

    onRun(id, minutes); 
    return HtmlService.createHtmlOutput(html).setSandboxMode(HtmlService.SandboxMode.IFRAME); 

} 

Или поместить значения в Cache:

function doGet(e) { 

    var id = e.parameter.id; 
    var minutes = e.parameter.min; 

    if (!!id) {cache.put('theid', id, 4000);}; 
    if (!!minutes) {cache.put('min', minutes, 4000);}; 

    var html = . . . . . HTML HERE; 

    onRun(id, minutes); 
    return HtmlService.createHtmlOutput(html).setSandboxMode(HtmlService.SandboxMode.IFRAME); 

} 

Затем вы можете извлекать значения из кэша, или использования глобальная переменная в любом месте вашего кода.

Таким образом, вам не нужно передавать что-либо из HTML в код .gs.

Я не вижу ничего, что вызывает функцию onRun() в функции doGet().

Вы можете вызвать другую функцию из функции doGet(), до тех пор, как это перед темreturn. return останавливает функцию в этой точке.

function doGet(e) { 

    var id = e.parameter.id; 
    var minutes = e.parameter.min; 

    var html = . . . . . HTML HERE; 

    onRun(id, minutes); 
    return HtmlService.createHtmlOutput(html).setSandboxMode(HtmlService.SandboxMode.IFRAME); 

} 

Вы не можете иметь:

return HtmlService.createHtmlOutput(html).setSandboxMode(HtmlService.SandboxMode.IFRAME); 
    onRun(id, minutes); 

Вы также можете запустить скрипт для запуска с помощью тега HTML Script с window.onload = function() {code};:

<script> 
    window.onload = function() { 
    console.log("This onload did run"); 
    code here; 
    }; 
</script> 

Чтобы передать несколько переменных, просто отделить их запятой:

function doGet(e) { 

    code here; 

    onRun(id, minutes); 
} 

function onRun(argId, argMinutes) { 
    Logger.log('argId: ' + argId); 
    Logger.log('argMinutes: ' + argMinutes); 
}; 
+0

Благодарим вас за подробное описание, и я понимаю, что вы говорите. Однако я хочу, чтобы переменные передавались функции onRun() при нажатии кнопки. Это означает, что onRun (id, min) (или google.script.run.onRun (id, min)) необходимо запустить из HtmlService, а не непосредственно из gs-файла. –

+0

Вам не нужно передавать переменные. Вам нужно поместить значения в Cache или в глобальную переменную. См. Мой обновленный ответ. –

+0

Я протестировал с использованием частного кеша, и он произвел ошибку, когда я переключился на общедоступный, все сказанное работало должным образом. Я отправил второй ответ с обновленным кодом из моего оригинального сообщения. –

1

Хитрость заключается в использовании общего кеша (спасибо Sandy Good).

function doGet(e) { 

    var id = e.parameter.id; 
    var minutes = e.parameter.min; 

    var cache = CacheService.getPublicCache(); 
    cache.put("id", id, 30); 
    cache.put("minutes", minutes, 30); 

    var html = '<p>' 
    +'<button onClick=google.script.run.onRun()>Run without parameter</button>' 
    +'<button onClick=google.script.run.turnOn()>On</button>' 
    +'<button onClick=google.script.run.turnOff()>Off</button>' 
    +'</p>'; 

    return HtmlService.createHtmlOutput(html).setSandboxMode(HtmlService.SandboxMode.IFRAME); 

} 

function onRun(id){ 
    var cache = CacheService.getPublicCache(); 
var id = cache.get('id')); 
var minutes = cache.get('minutes')); 
} 
Смежные вопросы