составление сценария отправки формы в документы Google - PullRequest
10 голосов
/ 24 января 2010

Я пытаюсь создать букмарклет, который анализирует страницу и отправляет результаты в электронную таблицу 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);

// возвращает:

Ничего не сохраняется в форме через букмарклет - есть ли способ зафиксировать ответ Google в коде моего букмарклета? (впрочем, я ввел jQuery через jQueryify)

EDIT:

Сетевая панель Firebug не слышит ни о какой активности, вызванной букмарклетом. Как насчет этого подхода из viewform метода goolgle вместо formresponse .

Форма, которую я пытаюсь отправить, находится по адресу:

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

Как я могу перейти к вводу значений скрипта в эту форму, а затем отправить их - снова ... через скрипт внутри букмарклета, который был бы запущен при разборе страницы?

Ответы [ 7 ]

7 голосов
/ 24 января 2010

, если вы уже используете 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);
  },
})
4 голосов
/ 11 декабря 2012

Для любого в будущем, убедитесь, что URL, на который вы отправляете сообщение, имеет & ifq в конце, я обнаружил, что это легко решило большинство моих проблем с 405 возвратами.

4 голосов
/ 31 мая 2011

Я только что сделал такую ​​вещь. Вот разбивка моего процесса.

Мне нужно вести список цитат с разных веб-страниц и добавлять информацию к каждой цитате.

Мой букмарклет будет динамически генерировать форму Google (я только что просмотрел источник настоящей формы Google, которую я уже создал), автоматически заполнит текущий URL, заголовок страницы и текущий выбранный текст, затем, форма будет отправлена ​​.

Поскольку мне нужно вручную добавить информацию, я намеренно не включил хотя бы одно обязательное поле, поэтому я получаю форму Google с сообщением об ошибке (но URL-адрес, заголовок и цитата уже заполнены). Теперь я могу вручную добавить всю необходимую мне информацию и отправить форму.

Если букмарклет заполнит все обязательные поля, вы получите ответ об успешном заполнении формы Google "Спасибо! Ваш ответ записан."

Я использовал следующий сайт для создания букмарклета, использующего jQuery: http://benalman.com/code/test/jquery-run-code-bookmarklet/ (Я использую jQuery, чтобы иметь возможность удалять дополнительную информацию и контент с веб-страницы)

Чтобы использовать этот сайт должным образом, вам нужно экранировать однострочник html (вы можете использовать этот escape-инструмент )

Необходимые шаги:

  1. Создание формы / таблиц Google
  2. Просмотр источника формы и копирование полей, которые вы хотите заполнить букмарклетом
  3. Избегайте html и используйте this , чтобы написать свой скрипт, заполняющий информацию, этот сайт создаст для вас букмарклет

Так что в моем случае:

1. Я создал форму, включающую одно текстовое поле для хранения URL-адреса, другое текстовое поле для хранения заголовка страницы, текст абзаца для цитаты (выделенный текст) , Форма также включает в себя некоторые другие обязательные поля, которые я заполняю вручную.

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

Этот метод был протестирован с хромом. Удачи!

2 голосов
/ 18 февраля 2013

На сегодняшний день я не смог получить ответ, помеченный как правильный. Я считаю, что Google изменил несколько вещей.

Я мог бы заставить его работать, выполнив HTTP POST для https://docs.google.com/forms/d/<form_id>/formResponse

с данными формы как entry.645136839=<somevalue>, где большое число получается из поля формы.

1 голос
/ 05 мая 2010

У меня нет полного ответа, но я смог заставить его работать, используя Curl:

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

Кроме того, я могу заставить его работать через Ajax с использованием прототипа, но ТОЛЬКО в Safari.

Я тоже получаю тот же метод 405, который не разрешен в Firefox. Вот мой сценарий:

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.

0 голосов
/ 17 августа 2015

Из вашего примера кода - я изменил пару вещей - во-первых, конечная точка отправки формы / нет & ifq необходимо. Google, вероятно, обновил вещи. Просмотрите источник вашей формы и используйте URL-адрес действия формы. во-вторых и критически, ваши типы ввода в форму не включали идентификаторы (кроме первого). С этими вещами - форма размещена успешно.

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>
0 голосов
/ 20 апреля 2010

Я думал, у меня есть несколько лакомых кусочков, но они, похоже, НЕ решают проблему.

  • обязательно используйте ввод 'name' (не id)
  • одним из других параметров является 'ifq', не уверен, как он работает для связывания этого с 'formkey' (строка - это просто строка, верно?)
  • чтобы полностью смоделировать форму Google, добавьте следующие дополнительные поля: pageNumber = 0; backupCache = ''; представить = Submit

Я получаю ту же ошибку "Метод 405 не разрешен", хотя ...

...