2012-04-03 128 views
20

我正在尝试将表单数据发布到谷歌电子表格。目前,如果表单有效,那么会发生以下情况:AJAX发布到Google电子表格

if (validateForm === true) { 
     $.ajax({ 
      type: 'post', 
      url: 'https://docs.google.com/spreadsheet/ccc?key=0AlwuDjMUxwhqdGp1WU1KQ0FoUGZpbFRuUDRzRkszc3c', 
      data: $("#workPLZ").serialize(), 
      success: alert($("#workPLZ").serialize()) 
     }); 
    } 
    else {} 

我用成功设置来验证我的表单数据被正确序列化(它是),它是成功的。但是,我的谷歌电子表格没有被更新(没有数据正在经历)。我在这里使用了示例代码,将doGet更改为doPost(http://mashe.hawksey.info/2011/10/google-spreadsheets-as-a-database-insert-with-apps-script-form-postget-submit-method/),并使Google电子表格公开可用(任何人都可以编辑)。我遵循指示,在代码中复制到googledocs,然后运行setUp两次(第一次请求权限,第二次运行它,我没有注意到任何事情发生)。谁能帮我?我觉得我非常接近。

+0

通常会阻止跨站点脚本(即,ajax发布到除当前所在域之外的域),并且它将返回200代码,但它实际上失败了。你确定不是这样吗? – Kristian 2012-04-03 19:33:46

+0

我不知道 - 我对这一切都比较陌生。我该如何检查? – 2012-04-03 20:07:58

+1

workPLZ。 99%的时间我感觉如何 – 2013-11-25 16:49:38

回答

34

好吧,我想出了一个解决方案。在被告知跨域AJAX问题之后,我决定继续并按照文章作者在http://mashe.hawksey.info/2011/10/google-spreadsheets-as-a-database-insert-with-apps-script-form-postget-submit-method/处使用的方法“t”。

要将数据发布到您的Google电子表格中,请先制作电子表格并将表格名称(左下角)更改为DATA。接下来,打开电子表格中的脚本编辑器(工具==>脚本编辑器)并粘贴文章中的脚本。将“doGet(e)”更改为“doPost(e)”。运行setUp脚本两次。第一次它会要求运行许可(授予它),然后第二次选择运行它时,它不会得到它已经运行的任何弹出指示(我在编辑器中运行它,所以它说上面的“运行setUp”代码输入区域,但那是全部)。之后,在脚本编辑器中选择“发布”,然后选择“发布为服务”。单击“允许任何人调用此服务”单选按钮和“允许匿名访问”复选框。复制网址(重要!)并点击“启用服务”。这是“困难的一部分”。

在您的HTML表单中,您提交的每个元素必须具有“名称”属性(例如)此名称是数据的发送方式 - 每个条目都附加到其名称。确保您收集的每一份表单数据都有一个名称,该名称作为电子表格中的一列输入(这就是它将数据从表单映射到电子表格的方式)。为了您的形式,这样设置后的方法和行动,你的“发布为服务” URL(我告诉你保存):我包括表格ID,所以我可以选择的形式

<form id="formID" method="post" action="URL" target="hidden_iframe"> 

和用jquery提交。在你的HTML,上面的表格前,添加隐藏的iframe:

<iframe name="hidden_iframe" id="hidden_iframe" style="display:none;"></iframe> 

设置某种形式的验证(不是必须的,但如果每场不填写你会在你的电子表格会得到不完整数据) ,如果它被验证有它调用jquery .submit()。 例如:

if (formValidation === true){ 
      $("#formID").submit(); 
    } 
    else {} 

就是这样。祝你好运!

+1

拼图的最后一部分是某种响应确认,这里使用iframe的'onload()'进行了记录。这当然不是防弹的,但它是一个开始。 http://stackoverflow.com/questions/467008/asynchronous-cross-domain-post-request-via-javascript#answer-467065 – 2013-04-13 00:56:20

+0

非常感谢您的回答,你让我很快乐! – 2014-03-17 10:53:34

+0

@Stuart Nelson。没有“作为服务发布”,而是将其部署为Web应用程序!我们应该选择那个吗? – user1788736 2015-10-04 19:39:34

10

由于Google Apps脚本现在有一个ContentService可以返回JSON响应,因此可以在不使用隐藏的iframe的情况下发出ajax请求。由于原来的解决方案的文章作者我已经published an updated version of this technique which includes an ajax example

用户可能还需要考虑切换到这个新版本,因为它利用了其它新的谷歌Apps脚本服务,特别是:

+0

链接到你的文章是死的 – 2015-03-21 19:56:31

+0

服务器的困境 - 应该是 – mhawksey 2015-03-22 17:38:21

+0

@mhawksey你能帮忙吗? HTTP://计算器。com/questions/33180172/why-does-mailapp-sendemail-from-google-spreadsheet-script-not-work我正在使用你的脚本,但试图在表单发送时发送一封电子邮件。 – nelsonic 2015-10-16 21:58:31

2

我会告诉你最简单的方式将数据发送到谷歌的电子表格不AJAX没有谷歌的形式,或PHP ...只是谷歌电子表格和HTML或甚至是Android。

  1. 创建一个新的谷歌电子表格。
  2. 打开工具/脚本编辑器

你只需要在编辑器中两个文件的HTML和Code.gs:

为例:

  • 转到文件/新的HTML名称文件=的Index.html:

    <!DOCTYPE html> 
    <html> 
    <head> 
    <base target="_top"> 
    
    <script> 
    function Enviar(){ 
    
    var txt1=document.getElementById("txt1").value; 
    var txt2=document.getElementById("txt2").value; 
    var txt3=document.getElementById("txt3").value; 
    google.script.run.doSomething(txt1,txt2,txt3); 
    } 
    </script> 
    </head> 
    
    <body> 
    Prueba de Envio de informacion<br> 
    <input type="text" value="EMAIL" name="txt1" id="txt1"><br> 
    <input type="text" value="CEDULA" name="txt2" id="txt2"><br> 
    <input type="text" value="NOMBRE" name="txt3" id="txt3"><BR> 
    <Button name="btn1" onClick="Enviar();">Enviar</button> 
    </body> 
    
    </html> 
    
  • 有3个字段以发送:EMAIL,CEDULA,NOMBRE

  • 在同一ScriptEditor去解Code.gs文件和类型:

    function doGet() { 
    return HtmlService.createHtmlOutputFromFile('Index') 
    .setSandboxMode(HtmlService.SandboxMode.IFRAME); 
    } 
    
    function doSomething(s1,s2,s3){ 
    
    Logger.log('datos:'+s1+" "+s2+" "+s3); 
    var enlace="https://docs.google.com/spreadsheets/d/ 
    1XuAXmUeGz2Ffr11R8YZNihLE_HSck9Hf_mRtFSXjWGw/edit"; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var ss = SpreadsheetApp.openByUrl(enlace); 
    var sheet = ss.getSheets()[0]; 
    sheet.appendRow([s1, s2, s3]); 
    Logger.log(ss.getName()); 
    } 
    
  • 其中enlace是您的电子表格的网址

    1. 发布为应用程序应用程序并获取新脚本的网址。现在,您可以将此网址用作嵌入HTML应用程序或Android应用程序中。而已。用户将被要求获得打开此脚本的权限
    相关问题