编写谷歌文档表单提交脚本

时间:2010-01-24 19:18:57

标签: jquery bookmarklet google-docs

我正在尝试创建一个解析页面的书签,并通过我定义的表单将结果发送到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的Net面板没有听到由bookmarklet触发的任何活动 - 我如何通过goolgle的 viewform 方法而不是 formresponse 来处理此事。

我要提交的表单位于:

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

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

7 个答案:

答案 0 :(得分:7)

如果你已经在使用jquery,请尝试通过ajax($ .ajax)提交表单。您可以设置一个成功功能,当谷歌发回他们的回复时将会调用该功能。

或者你应该能够使用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);
  },
})

答案 1 :(得分:4)

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

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

我的书签将动态生成一个谷歌表单(我刚查看了我已经创建的真实谷歌表单的来源),它将自动填写当前网址,网页标题和当前选中的文字,表格将被提交

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

如果书签填充了所有必填字段,您只会收到Google表单成功回复“谢谢!您的回复已被记录。”

我使用以下网站生成使用jQuery的书签: http://benalman.com/code/test/jquery-run-code-bookmarklet/ (我正在使用jQuery来从网页上删除其他信息和内容)

为了能够正确使用该网站,您必须逃避单行 html(您可以使用此escape tool

所需的步骤是:

  1. 创建Google表单/电子表格
  2. 查看表单来源并复制您希望书签填充的字段
  3. 转义您的HTML并使用this编写填写信息的脚本,此网站将为您创建书签
  4. 所以在我的情况下:

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

    2. 我准备了以下html:

        <form method="POST"
            action="https://spreadsheets.google.com/spreadsheet/formResponse?formkey=XYZXYZXYZXYZXYZXYZXYZ&amp;ifq">
        <input type="text" name="entry.0.single" value="" id="entry_0" />
        <input type="text" name="entry.3.single" value="" id="entry_3" />
        <textarea name="entry.2.single" id="entry_2"></textarea>
        <input type="submit" name="submit" value="submit" />
        </form>
    

    (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进行测试。 祝你好运!

答案 2 :(得分:4)

对于将来的任何人,请确保您发布的网址最后有&amp; ifq,我发现这很容易解决我的大多数问题,并返回405。

答案 3 :(得分:2)

截至今天,我无法得到正确的工作答案。我相信谷歌改变了一些事情。

我可以通过对https://docs.google.com/forms/d/<form_id>/formResponse

进行HTTP POST来实现它

表单数据为entry.645136839=<somevalue>,其中大号是从表单字段中获取的。

答案 4 :(得分:1)

我没有完整的答案,但我能够使用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 :(得分:0)

我以为我有一些花絮要加上这个,但结果却没有解决问题。

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

虽然我得到了相同的'405 Method not allowed'错误...

答案 6 :(得分:0)

从您的示例代码中 - 我更改了一些内容 - 首先是表单提交结束点/ no&amp; ifq needed。谷歌可能已经更新了。查看表单来源并使用表单操作URL。其次&amp;严格来说,您的表单输入类型不包含ID(第一个除外)。有了这些东西 - 表格成功发布。

enter image description here

<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>