2013-03-16 15 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