2010-01-24 12 views
10

Ich versuche, ein Bookmarklet zu erstellen, das eine Seite analysiert und die Ergebnisse über ein Formular, das ich definiert habe, an eine googledocs-Tabelle sendet.Scripting einer Google Docs-Formularvorlage

Das relevent Bit des Skripts ist:

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

// returns:

Nichts wird auf das Formular über das Bookmarklet gespeichert - jede Art und Weise Googles Antwort in Code mein Bookmarklet ist zu erfassen? (FWIW, habe ich jQuery über jQueryify injiziert)

EDIT:

Firebug Net Panel hört nichts von der Tätigkeit des Bookmarklet ausgelöst - Wie wäre es i nähern dies von goolgle des viewform Methode statt Formularantwort.

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

Wie kann ich über die Injektion das Skript in dieser Form Werte gehen und dann die Vorlage - wieder ... über ein Skript innerhalb der:

Die Form i einreichen bin versucht, befindet sich unter Bookmarklet, das während der Analyse der Seite ausgelöst wurde?

+0

Um das 405 Problem mit firefox, Verwendung Libcurl zu lösen. Sollte in der Lage sein, dies in PHP und Python zu tun. – razorsniper

+0

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

Antwort

7

Wenn Sie bereits jquery verwenden, versuchen Sie, das Formular über Ajax ($ .ajax) zu senden. Sie können eine Erfolgsfunktion einrichten, die aufgerufen wird, wenn Google ihre Antwort zurücksendet.

Alternativ sollten Sie in der Lage sein, Firebug zu verwenden, um die Antwort anzuzeigen, die Google zurücksendet.

Insbesondere dachte ich Sie so etwas wie das folgende versuchen könnte:

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

Vielen Dank für die zusätzlichen Details ... Ich habe ein paar Variationen ausprobiert Ihr Code - gleich aus welchem ​​Grund - ‚Konsole ist nicht definiert‘, so bin ich nur Sachen auf ein Warnfeld zu werfen: Vielleicht ist dieser Bildschirm Kappe helfen: http://screencast.com/t/ZDZhNDVmM wieder ... thx für die hilfe – justSteve

+1

hast du es wahrscheinlich schon herausgefunden, aber console ist einzigartig für das firebug plugin. – buckley

+1

console.log() ist auch in Chrome – dvb

0

Ich dachte, ich ein paar Leckerbissen musste diese hinzufügen, aber sie erweisen sich das Problem nicht lösen.

  • auf jeden Fall die Eingabe ‚name‘ verwenden (nicht id)
  • einer der anderen Parameter ist ‚IFQ‘, nicht sicher, wie es funktioniert, dies zu bündeln mit ‚formkey‘ (eine Zeichenkette nur ein String ist, richtig?)
  • , um das Google-Formular vollständig zu verspotten, fügen Sie diese zusätzlichen Felder hinzu: pageNumber = 0; backupCache = ''; submit = Senden

ich das gleiche bekommen, obwohl ...

1

Ich habe keine vollständige Antwort haben Fehler ‚405 Methode nicht erlaubt‘, aber ich in der Lage gewesen, um es mit Locken funktioniert:

Auch ich kann es über Ajax arbeiten mit Prototyp, aber nur auf Safari.

Ich auch die gleiche 405 Methode nicht in Firefox erlaubt.Hier ist mein Skript:

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

}

Auch mein onFailure nie aufgerufen wird, nur onSuccess.

4

Ich habe gerade so etwas gemacht. Hier ist eine Zusammenfassung meines Prozesses.

Ich muss eine Liste von Anführungszeichen von verschiedenen Webseiten behalten und jedem Zitat einige Informationen hinzufügen.

Mein Bookmarklet wird dynamisch eine Google-Form generieren (Ich habe gesehen nur die Quelle der echten Google-Formular, das ich bereits erstellt haben), wird es die aktuelle URL automatisch füllen, der Seitentitel, und der aktuell ausgewählte Text, als, das Formular wird eingereicht werden.

Da ich manuell Informationen hinzufügen muss, ich absichtlich nicht mindestens ein Pflichtfeld enthalten, so erhalte ich das Google Formular mit einer Fehlermeldung (aber mit URL, Titel & Zitat bereits ausgefüllt). Jetzt kann ich manuell alle weiteren benötigten Informationen hinzufügen und das Formular abschicken.

Wenn das Bookmarklet alle erforderlichen Felder ausfüllt, erhalten Sie nur die Google Formular-Erfolgsantwort "Danke! Ihre Antwort wurde aufgezeichnet."

Ich habe die folgende Website verwendet ein Bookmarklet zu erzeugen, die mit jQuery: http://benalman.com/code/test/jquery-run-code-bookmarklet/ (I jQuery bin mit & Inhalt von der Webseite weiteren Informationen zu können, Schrott)

Um zu verwenden, dass vor Ort richtig, werden Sie Ihre Einzeiler html entkommen müssen (können Sie diese verwenden escape tool)

Die erforderlichen Schritte sind:

  1. Erstellen Sie eine Google-Form/Tabellen
  2. Ansicht, die Quelle der Form und kopieren Sie die Felder, die Bookmarklet möchten Ihre HTML füllen
  3. Flucht- und this verwenden das Skript zu schreiben, die die Informationen füllen, erstellt diese Seite die Bookmarklet für Sie

Also in meinem Fall:

1. ich ein Formular erstellt haben, die ein Textfeld die uRL zu halten, ein anderes Textfeld den Titel der Seite zu halten, ein Absatztext, um das Zitat zu halten (die Auswahl ed Text). Das Formular enthält auch einige andere Pflichtfelder, die ich manuell ausfülle.

2. ich folgende html vorbereitet:

 
    <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 - Seitentitel, entry_2 - Zitat)

3. Nachdem es in einer Zeile setzen und entkam es.Ich habe das folgende Skript verwendet:

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

Dieses Verfahren mit Chrom getestet wurde. Viel Glück!

+0

Vielen Dank !!!! Das ist großartig! – xun

4

Für alle in der Zukunft, stellen Sie sicher, dass die URL, auf die Sie posten, & ifq am Ende hat, habe ich festgestellt, dass dies die meisten meiner Probleme mit 405 Rückgaben behoben hat.

2

Ab heute konnte ich nicht die richtige Antwort zur Arbeit bekommen. Ich glaube, Google hat ein paar Dinge verändert.

Ich konnte es aus dem Formularfeld erhalten, indem Sie ein HTTP-POST https://docs.google.com/forms/d/<form_id>/formResponse

mit Formulardaten als entry.645136839=<somevalue> wo die große Nummer zu arbeiten.

0

Von Ihrem Beispiel-Code - ich habe ein paar Dinge geändert - erstens das Formular Einreichung Endpunkt/keine & ifq benötigt. Google hat wahrscheinlich Dinge aktualisiert. Zeigen Sie die Quelle Ihres Formulars an und verwenden Sie die Formularaktions-URL. zweitens & kritisch Ihre Formular-Eingabe-Typen enthalten die IDs (mit Ausnahme der ersten). Mit diesen Dingen - das Formular erfolgreich gebucht.

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>