【问题标题】:scripting a google docs form submission编写 google docs 表单提交脚本
【发布时间】:2015-08-17 12:41:25
【问题描述】:

我正在尝试创建一个小书签,用于解析页面并通过我定义的表单将结果发送到 googledocs 电子表格。

脚本的相关位是:

var form = document.createElement("form");

form.action = "http://spreadsheets.google.com/formResponse?formkey=Fd0SHgwQ3YwSFd5UHZpM1QxMlNOdlE6MA&ifq";
form.method = "POST";
form.id="ss-form";
form.innerHTML = ["<input id='entry_0' name = 'entry.0.single' value = '" + orderDate + "'/>", "<input name = 'entry.2.single' value = '" + email + "'/>", "<input name = 'entry.3.single' value = '" + customerID + "'/>", ].join("");
form.submit();


alert(form.innerHTML);

// 返回:

没有任何内容通过小书签保存到表单中 - 有什么方法可以在我的小书签代码中捕获谷歌的响应? (fwiw,我已经通过 jQueryify 注入了 jQuery)

编辑:

Firebug 的网络面板没有听到任何由小书签触发的活动 - 我如何通过 goolgle 的 viewform 方法而不是 formresponse 来解决这个问题。

我要提交的表单位于:

http://spreadsheets.google.com/viewform?hl=en&formkey=dFd0SHgwQ3YwSFd5UHZpM1QxMlNOdlE6MA

我如何才能将脚本值注入该表单,然后再次提交...通过小书签中的脚本,该脚本在被解析的页面上会被触发?

【问题讨论】:

标签: jquery bookmarklet google-docs


【解决方案1】:

如果您已经在使用 jquery,请尝试通过 ajax ($.ajax) 提交表单。您可以设置一个成功函数,当 google 发回他们的响应时将调用该函数。

或者,您应该能够使用 firebug 查看 google 发回的响应。

具体来说,我认为您可以尝试以下方法:

$.ajax({
  url: "http://spreadsheets.google.com/formResponse",
  data: { formkey: "Fd0SHgwQ3YwSFd5UHZpM1QxMlNOdlE6MA&ifq", "entry.0.single": orderDate, "entry.2.single": email, "entry.3.single": customerID },
  type: "POST",
  dataType: "xml",
  success: function(data, textStatus, XMLHttpRequest) {
    console.log("success");
    console.log(data);
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
    console.log("error");
    console.log(textStatus);
  },
})

【讨论】:

  • 非常感谢您添加的详细信息...我已经尝试了您的代码的几个变体 - 无论出于何种原因 - '控制台未定义'所以我只是将东西扔到警报框:也许此屏幕截图将有所帮助:screencast.com/t/ZDZhNDVmM 再次...感谢您的帮助
  • 你现在可能已经明白了,但是控制台是 firebug 插件独有的。
  • console.log() 也可以在 Chrome 中使用
  • 只是记录:错误错误...在此期间有什么变化吗?
【解决方案2】:

我刚刚做了这样的事情。这是我的过程的分解。

我需要保留来自不同网页的引用列表,并为每个引用添加一些信息。

我的书签会动态生成一个谷歌表单(我刚刚查看了我已经创建的真正谷歌表单的来源),它会自动填写 当前 url、页面标题和当前选择的文本,然后,将提交表单

由于我需要手动添加信息,因此我故意没有包含至少一个必填字段,因此我收到了带有错误消息的 google 表单(但已经填写了 url、标题和报价)。现在我可以手动添加我需要的所有其他信息并提交表单。

如果小书签填写了所有必填字段,您将收到谷歌表单成功回复“谢谢!您的回复已被记录。”

我使用以下站点生成了一个使用 jQuery 的书签: http://benalman.com/code/test/jquery-run-code-bookmarklet/ (我正在使用 jQuery 来从网页中抓取其他信息和内容)

为了能够正确使用该网站,您必须转义您的 one-liner html(您可以使用 escape tool

需要的步骤是:

  1. 创建 Google 表单/电子表格
  2. 查看表单源并复制您希望小书签填写的字段
  3. 转义您的 html 并使用 this 编写填充信息的脚本,此站点将为您创建书签

所以在我的情况下:

1. 我创建了一个表单,其中包含一个用于保存 url 的文本字段,另一个用于保存页面标题的文本字段,一个用于保存引用的段落文本(选定的文本)。该表格还包括我手动填写的其他一些必填字段。

2.我准备了以下html:

(entry_0 - url,entry_3 - 页面标题,entry_2 - 引用)

3. 放在一行并转义后。我使用了以下脚本:

frm = $(unescape('%3Cform%20action%3D%22https%3A//spreadsheets.google.com/spreadsheet/formResponse%3Fformkey%3DXYZXYZXYZXYZXYZXYZXYZ%26amp%3Bifq%22%20method%3D%22POST%22%3E%0A%3Cinput%20type%3D%22text%22%20name%3D%22entry.0.single%22%20value%3D%22%22%20id%3D%22entry_0%22%20/%3E%0A%3Cinput%20type%3D%22text%22%20name%3D%22entry.3.single%22%20value%3D%22%22%20id%3D%22entry_3%22%20/%3E%0A%3Ctextarea%20name%3D%22entry.2.single%22%20id%3D%22entry_2%22%3E%3C/textarea%3E%0A%3Cinput%20type%3D%22submit%22%20name%3D%22submit%22%20value%3D%22submit%22%20/%3E%0A%3C/form%3E'));
$(frm).children('#entry_0').attr('value',location.href);
$(frm).children('#entry_3').attr('value',$('title')[0].innerHTML);
$(frm).children('#entry_2').html(window.getSelection().toString());
$(frm).children('input[type=submit]').click()

这个方法已经用 chrome 测试过了。 祝你好运!

【讨论】:

    【解决方案3】:

    对于将来的任何人,请确保您发布到的 URL 末尾有 &ifq,我发现这很容易解决了我的大部分问题,即 405 返回。

    【讨论】:

      【解决方案4】:

      我没有完整的答案,但我已经能够使用 Curl 使其工作:

      curl http://spreadsheets.google.com/formResponse?formkey=dFpVLTVFY2t5dWdoNTZpNERwWDRxX2c6MQ&ifq --data entry.0.single=eric --data entry.1.single=pugh
      

      另外,我可以使用原型通过 Ajax 让它工作,但只能在 Safari 上。

      我也得到了 Firefox 中不允许的相同 405 方法。这是我的脚本:

      function vote_for_synonym(word1, word2){
      word1 = encodeURIComponent(word1);
      word2 = encodeURIComponent(word2);
      
      $req = new Ajax.Request("http://spreadsheets.google.com/formResponse?formkey=dFpVLTVFY2t5dWdoNTZpNERwWDRxX2c6MQ", {
        method: 'post',
        contentType: 'application/x-www-form-urlencoded',
        onCreate: function(){
         Element.show('systemWorking');
        },
        onSuccess: function() {
          Element.show('thanks');
          Element.hide('systemWorking')
        },
        onFailure: function() {
          Element.show('error');
        }
      });           
      

      }

      另外,我的 onFailure 永远不会被调用,只会调用 onSuccess。

      【讨论】:

        【解决方案5】:

        截至今天,我无法得到标记为可以工作的答案。我相信谷歌已经改变了一些东西。

        我可以通过对https://docs.google.com/forms/d/&lt;form_id&gt;/formResponse 进行 HTTP POST 来使其工作

        表单数据为entry.645136839=&lt;somevalue&gt;,其中大数取自表单字段。

        【讨论】:

          【解决方案6】:

          从您的示例代码中 - 我改变了一些东西 - 首先是表单提交端点/不需要 &ifq。谷歌可能已经更新了一些东西。查看表单的来源并使用表单操作 URL。其次,关键是您的表单输入类型不包括 ID(第一个除外)。有了这些东西 - 表格发布成功。

          <html>
          <body>
          <script type="text/javascript">
          var form = document.createElement("form");
          
          form.action = "https://docs.google.com/a/yourdomain.com/forms/d/XXXXXXXXXXXXXXXXXXXX/formResponse";
          form.method = "POST";
          form.id="ss-form";
          var repo = "https://github.com/fredericcormier/WesternMusicElements";
          var branch = "master";
          var email = "";
          
          form.innerHTML = ["<input id='entry_639106242' name = 'entry.639106242' value = '" + repo + "'/>","<input id='entry_1546762025' name = 'entry.1546762025' value = '" + branch + "'/>","<input id='entry_1509161732' name = 'entry.1509161732' value = '" + email + "'/>", ].join("");
          form.submit();
          
          alert(form.innerHTML);
          
          </script>
          
          </body>
          </html>
          

          【讨论】:

            【解决方案7】:

            我以为我有一些花絮要补充,但事实证明它们并不能解决问题。

            • 一定要使用输入'name'(不是id)
            • 其他参数之一是 'ifq',不确定如何将其与 'formkey' 捆绑在一起(字符串只是字符串,对吗?)
            • 要完全模拟 Google 表单,请添加以下附加字段:pageNumber=0;备份缓存=''; submit=提交

            我得到了同样的“405 Method not allowed”错误...

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-07
              • 2016-01-26
              • 1970-01-01
              • 2012-12-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多