2010-01-24 15 views
10

Sto cercando di creare un bookmarklet che analizza una pagina e invia i risultati in un foglio di calcolo GoogleDocs tramite un modulo che ho definito.script di un modulo Google docs presentazione

Il bit relevent dello script è:

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

// ritorna:

Niente viene salvato il modulo tramite il bookmarklet - un modo per catturare la risposta di Google nel codice del mio bookmarklet? (FWIW, ho iniettato jQuery via jQueryify)

EDIT: della parte della rete

di Firebug non sta ascoltando una qualsiasi delle attività di innescata dalla bookmarklet - Che ne dici mi avvicino a questo dal metodo viewform di Goolgle invece di formresponse.

La forma che sto cercando di inviare si trova a:

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

Come posso fare per iniettare lo script valori in quella forma e poi sostenendo che - ancora una volta ... tramite script all'interno del bookmarklet che sarebbe stato attivato mentre la pagina veniva analizzata?

+0

per risolvere il problema con Firefox 405, l'uso libcurl. Dovrebbe essere in grado di farlo in PHP e Python. – razorsniper

+0

Link utile: http://eureka.ykyuen.info/2014/07/30/submit-google-forms-by-curl-command/ –

risposta

7

se il vostro già utilizzando jQuery, cercano di inviare il modulo tramite la tecnologia AJAX ($ .ajax). Puoi impostare una funzione di successo che verrà chiamata quando google rispedirà la risposta.

in alternativa, si dovrebbe essere in grado di utilizzare Firebug per vedere la risposta di Google invia indietro.

In particolare Stavo pensando si potrebbe provare qualcosa di simile al seguente:

$.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); 
    }, 
}) 
+0

Grazie mille per il dettaglio aggiunto ... ho provato un paio di variazioni su il codice - per qualsiasi motivo - 'console non è definito' quindi sto solo buttando roba per una finestra di avviso: Forse questo tappo schermata vi aiuterà: http://screencast.com/t/ZDZhNDVmM ancora ... grazie per l'aiuto – justSteve

+1

probabilmente lo hai già capito, ma la console è unica per il plugin firebug. – buckley

+1

console.log() è utilizzabile anche in Chrome – dvb

0

pensavo di avere un paio di bocconcini da aggiungere a questo, ma si rivelano non risolvono il problema.

  • sicuramente utilizzare il 'nome' di ingresso (non id)
  • uno degli altri parametri è 'IFQ', non so come funziona per impacchettare questo con 'formkey' (una stringa è solo una stringa, vero?)
  • per deridere completamente il modulo di Google, aggiungere questi campi aggiuntivi: pageNumber = 0; backupCache = ''; sottometto = Invia

ottengo lo stesso '405 Metodo non consentito' errore però ...

1

Non ho una risposta completa, ma sono stato in grado di farlo funzionare con Curl:

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

Inoltre, sono in grado di farlo funzionare tramite Ajax utilizzando il prototipo, ma SOLO su Safari.

Anche io ho lo stesso metodo 405 non consentito in Firefox.Qui è il mio script:

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'); 
    } 
});   

}

Inoltre, il mio onFailure non viene mai chiamato, appena onSuccess.

4

Ho appena fatto una cosa del genere. Ecco una ripartizione del mio processo.

Ho bisogno di tenere un elenco di citazioni da pagine web diverse e di aggiungere alcune informazioni ad ogni preventivo.

mio bookmarklet in modo dinamico genererà una forma google (ho appena visto The fonte della vera e propria forma di google che ho già creato), sarà riempire automaticamente l'URL corrente, il titolo della pagina, e il testo attualmente selezionato, rispetto a, il modulo verrà inviato.

Poiché ho bisogno di aggiungere manualmente le informazioni, non ho intenzionalmente incluso almeno un campo obbligatorio, quindi ricevo il modulo Google con un messaggio di errore (ma con url, titolo & preventivo già compilato). Ora posso aggiungere manualmente tutte le altre informazioni di cui ho bisogno e inviare il modulo.

Se il bookmarklet riempie tutti i campi richiesti, riceverai semplicemente la risposta di successo del modulo google "Grazie! La tua risposta è stata registrata."

Ho usato il seguente sito per generare un bookmarklet che utilizzano jQuery: http://benalman.com/code/test/jquery-run-code-bookmarklet/ (sto usando jQuery per essere in grado di accantonare ulteriori informazioni & contenuti dalla pagina web)

Per poter utilizzare quel sito correttamente, dovrete sfuggire al tuo one-liner html (è possibile utilizzare questo escape tool)

I passaggi necessari sono:

  1. Creare un modulo google/fogli di calcolo
  2. visualizzare l'origine della forma e copiare i campi che si desidera il bookmarklet per riempire
  3. Fuga tuo html e utilizzare this di scrivere lo script che riempiono le informazioni, questo sito creerà il bookmarklet per voi

Così nel mio caso:

1. ho creato una forma che comprende un campo di testo per contenere l'url, un altro campo di testo per tenere il titolo della pagina, un testo del paragrafo per contenere la citazione (la selezione testo edito). Il modulo include anche altri campi obbligatori che compilo manualmente.

2. ho preparato il seguente codice 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 - titolo della pagina, entry_2 - citazione)

3. Dopo aver messo in una linea e sfuggendolo.Ho usato il seguente script:

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

Questo metodo è stato testato con il cromo. Buona fortuna!

+0

Grazie !!!! È grandioso! – xun

4

Per chiunque in futuro, assicurati che l'URL che stai postando abbia & ifq alla fine, ho trovato che questo ha risolto facilmente la maggior parte dei miei problemi con 405 resi.

2

A partire da oggi non ho potuto ottenere la risposta corretta per lavorare. Credo che Google abbia cambiato alcune cose.

ho potuto farlo funzionare facendo un HTTP POST per https://docs.google.com/forms/d/<form_id>/formResponse

con i dati del modulo come entry.645136839=<somevalue> dove il grande numero è ottenuto dal campo modulo.

0

Dal codice di esempio - Ho modificato un paio di cose: in primo luogo l'invio del modulo endpoint/no & ifq necessario. Google ha probabilmente aggiornato le cose. Visualizza l'origine del modulo e utilizza l'URL dell'azione del modulo. in secondo luogo, & in modo critico i tipi di input del modulo non includevano gli id ​​(tranne il primo). Con queste cose - il modulo pubblicato con successo.

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