2013-03-16 27 views
0

我想使用dopast()與HtmlService作爲異步調度程序調用其他功能。異步功能對於性能非常重要 - 無需等待電子表格操作完成,因此這就是HtmlService的用途。 這裏是我的代碼明智:HtmlService不工作從doPost() - 腳本異步替代想要

function doGet(e) { 
     var app = UiApp.createApplication(); 
    var button = app.createButton('Click Me'); 
    app.add(button); 
    var handler = app.createServerHandler('myClickHandler'); 
    button.addClickHandler(handler); 
    return app; 
} 

function myClickHandler(){ 
    sendHttpPostSelf(); 
} 
function doSomething() { 
    Logger.log('I was called Now!'); 
    return; 
} 
function sendHttpPostSelf() { 
    var payload = { 
     "name" : "name", 
     "comment" : "comment", 
     "screenshot" : "screenshot" 
    }; 
    var options = { 
     "method" : "post", 
     "payload" : payload 
    }; 
var url="https://script.google.com/macros/s/AKfycbzlVoiDQMbLe4yliErDoNub6A0m3tijSfPAUMEBENgIikQnLQ_H/exec"; 
var resp=UrlFetchApp.fetch(url,options); 
Logger.log(resp.getContentText());//.getContent()); 
} 
function doPost(e){ 
    var dbg; 
    var dbg=true; 
    if (dbg==true)for (var i in e.parameter)Logger.log("FormSubmit:doPost "+ i + ": " + e.parameter[i]); 
    return HtmlService.createHtmlOutputFromFile("myFile.html"); 
} 

//ANd HERE IS myFile.html 
<script> 
function onFailure(error) { 
    //alert('Error will Robinson!: '+error.message); 
    Logger.log('Error will Robinson!: '+error.message); 
    } 
    function onSuccess(error) { 
    //alert('Gotter Done'); 
    Logger.log("FormSubmit:doPost",'Gotter Done'); 
    } 
    google.script.run.withSuccessHandler(onSuccess).withFailureHandler(onFailure).doSomething(); 
</script> 

的httpPostSelf()工作好和doPost()接收PARMS不錯,但我的問題是, HtmlService.createHtmlOutputFromFile(「myFile.html」)不叫doSomething()正確嗎? 我只看到了很多神祕的卡哈解析的Logger.log
--END原QUESTION--

問題加成
親愛的科裏:

感謝您的反饋意見的doPost()不處理HtmlService和你提出的異步例子。 你是正確的,按鈕點擊事件是異步..但我的問題仍然沒有答案。爲了澄清, 允許我請進一步詳細闡述我的問題。我需要工作的是一個異步腳本調用Web應用程序(聽起來像AJAX我猜)。所有的作品在我的示例腳本中除了異步。另一種URL被使用,那麼在我前面的例子中調用單獨的Web應用程序,而不是一個自我後:

var url="https://script.google.com/a/macros/commet.com/s/AKfycbwJ4WM3U5POEWF9XqFzjaV_9TiNLspKb7kePAih59vsWllA0og/exec"; 

異步是性能的關鍵,因爲我的電子表格代碼2000加線進行基礎表操作:插入,刪除,更新,移動,排序..我有很好的方法打包到對象的腳本。工作表操作腳本當前與站點中的UiApp腳本一起打包並可同步調用。經過許多痛苦的重寫之後,一些更復雜的操作(排序和移動)仍需要7秒才能完成。

我想將sheet op腳本遷移到電子表格Web應用程序。 sheet op/Web App應該可以從我的Site UiApp進行異步調用。例如,當我的站點要求進行排序時,它將簡單地向Web應用程序釋放一個帶有parms的sendHttpPost,然後該站點將繼續完成其GUI業務(執行客戶端排序),而無需等待7秒鐘完成它的排序。 WaLaa!

帶有parms正確傳遞的web應用程序在我的示例腳本中工作,但UrlFetchApp.fetch不幸(對我來說)是同步的。這就是我嘗試使用異步HtmlService-google.script.run的原因。我試着用HtmlService作爲一個web應用程序調用doGet(),並且使用UrlFetchApp.fetch不起作用。 HtmlService作爲一個Web應用程序的唯一方式是通過一個帶有表單提交的按鈕進行調用...我需要一個可編寫腳本的界面。

UrlFetchApp.fetch的任何腳本化替代方案 - HtmlService?

評論HtmlService Web應用程序訪問
這裏是我的測試結果時HtmlService從web應用程序的工作原理:
的doPost()
- 當與FormPanel中
提交按鈕提交作品 - 提交時不工作與UrlFetchApp.fetch(需要腳本訪問)
評論:任何獲得doPost()與UrlFetchApp.fetch一起工作的方式對於編程表單來說都是非常棒的!

的doGet()
- 從瀏覽器的網址
工作 - 當UrlFetchApp.fetch(需要腳本訪問)
提交如果有任何不準確,請與腳本示例回覆不起作用。我需要的是UrlFetchApp.fetch腳本訪問。

+0

HtmlService頁面可以在沒有按鈕推送的情況下對任何腳本函數進行腳本化異步調用......只需編寫任何你想要的JavaScript並使用google.script.run,它是異步的。你將需要用戶有一個瀏覽器窗口打開腳本 – 2013-03-19 11:45:50

+0

請解釋並給出一個腳本界面的例子,如果你有一個工程。可編寫腳本的界面意味着此功能: 'function testAsyncHtmlService(){ return HtmlService.createHtmlOutputFromFile(「myFile.html」); }' 將調用來自與調用任何其它功能: _testAsyncHtmlService(); _ 這樣可不行......撥打HtmlService已通過的doGet打開應用的唯一途徑()。即使doGet()在Web應用程序中也不起作用。 – user1387318 2013-03-20 19:52:52

+0

您只能從doGet返回一個HtmlOutput,但您可以從任何google.script.run函數調用返回一個字符串,因此您可以返回HtmlOutput.getContent()。 – 2013-03-21 02:13:46

回答

1

當您在製作的HtmlTemplates中運行腳本時,他們無權訪問Apps腳本庫(但可以調用您的Apps腳本函數)。例如,您不能從您的Html頁面呼叫Logger.log()。你應該使用console.log()。這將記錄到您的Web控制檯。 (Chrome中的Ctrl + Shift + J)。

+0

謝謝你,是有幫助的。 -Commet – user1387318 2013-03-18 20:31:24

2

您正在嘗試通過doPost與UiApp聯繫HtmlService,這不起作用。 UiApp的doPost只能接受UiApp響應,而HtmlService甚至不使用doPost--它僅使用google.script.run語法。你所看到的是客戶端上的UiApp代碼完全被HtmlService類型的響應所困惑。

但我想你可能會對這兩種服務是如何工作感到困惑的,因爲UiApp ServerHandler回調和HtmlService google.script.run異步調用服務器腳本,而不需要你做任何自定義或棘手的事情。沒有必要混合和匹配兩者,也不需要參與doPost - 這是專門用於通過UiApp上傳文件的(這就是爲什麼HtmlService不支持它,因爲它具有更簡單的上傳文件的語法) 。

這是了UiApp異步調度:

function doGet() { 
    var app = UiApp.createApplication(); 
    app.add(app.createButton("run foo", app.createServerHandler("foo"))); 
    app.add(app.createButton("run bar", app.createServerHandler("bar"))); 
    return app; 
} 
function foo() { Logger.log("ran foo!"); } 
function bar() { Logger.log("ran bar!"); } 

這裏是HtmlService相同:

function doGet() { 
    return HtmlService.createHtmlOutput(
     "<button onclick='google.script.run.foo()'>run foo</button>" + 
     "<button onclick='google.script.run.bar()'>run bar</button>"); 
} 
function foo() { Logger.log("ran foo!"); } 
function bar() { Logger.log("ran bar!"); } 

要回答以下評論,在了UiApp從客戶端發送的值到服務器通過addCallbackElement。在HtmlService,你只需要添加參數到你的服務器功能:

function doGet() { 
    return HtmlService.createHtmlOutput(
     "<button onclick='var foo = document.getElementById(\'myTextBox\').value; google.script.run.foo(123, foo)'>run foo</button>" 
} 
function foo(x, y) { Logger.log("ran foo with params " + x + " and + "y"); } 

這應該登錄「跑使用參數123和myTextBox的內容富」。你應該能夠從那裏推廣(我建議閱讀用戶指南。)

+0

謝謝Corey - 請參閱以上問題補充以獲得澄清 – user1387318 2013-03-18 20:28:57

+0

您是否可以在本示例中顯示HtmlService的'.addCallbackElement(myTextBox)'的等價物? – 2013-10-28 16:55:47