2010-03-02 3 views
5

Ich versuche, etwas wie this post aber mit Excel VBA zu tun. Ich möchte jedes Mal, wenn eine Schaltfläche in einem Excel-Add-In gedrückt wird, eine Antwort in einem Google Docs-Formular senden. Das AddIn wird eine XLA-Datei sein und in VBA geschrieben sein.Verwenden Sie Excel VBA zum Ausfüllen und Übermitteln von Google Docs-Formular

Ich möchte in der Lage sein zu sammeln, welche Funktionen die Benutzer verwenden. Wenn jemand eine bessere Lösung hat, bin ich offen.

--- --- Bearbeiten

This ist die Form, ich zu schreiben versuchen (für eines der Felder Auszug des Codes.)

<div class="errorbox-good"> 
    <div class="ss-item ss-item-required ss-text"> 
     <div class="ss-form-entry"> 
      <label for="entry_0" class="ss-q-title"> 
       UserName 
       <span class="ss-required-asterisk">*</span> 
      </label> 
      <label for="entry_0" class="ss-q-help"></label> 
      <input type="text" 
        id="entry_0" 
        class="ss-q-short" 
        value="" 
        name="entry.0.single"> 
     </div> 
    </div> 
</div> 

--edit 2-- Dies ist, was ich bisher versucht habe, aber es funktioniert immer noch nicht. Ich erhalte einen Fehler in der Zeile, die sagt ".UserName.Value = Environ (" Benutzername ")" Ich vermute, es liegt daran, dass es das Element .username nicht findet.

Private Sub GoogleForm() 
    Dim ie As Object 
    Set ie = CreateObject("InternetExplorer.Application") 
    On Error GoTo errHandler 
    With ie 
     .navigate "http://spreadsheets.google.com/viewform?hl=en&cfg=true&formkey=dHFTMzkwR2RpY2tzSUNnbVhIcDN3WWc6MA" 
     Do While .busy: DoEvents: Loop 
      Do While .ReadyState <> 4: DoEvents: Loop 
       With .document.Forms(1) 
        'Username 
        .UserName.Value = Environ("username") 
        'Key 
        .Key.Value = "00qwe-12ckd" 
        .submit 
       End With 
       Do While Not CBool(InStrB(1, .document.URL, _ 
        "cp_search_response-e.asp")) 
        DoEvents 
       Loop 
       Do While .busy: DoEvents: Loop 
       Do While .ReadyState <> 4: DoEvents: Loop 
       MsgBox .document.all.tags("table").Item(11).Rows(1).Cells(7).innerText 
    End With 
Exit Sub 
errHandler: 
    ie.Quit: Set ie = Nothing 
End Sub 
+0

@guitarthrower: wollte nur unter Antworten, wenn die Antwort überprüfen, um zu sehen Ihre Frage. –

+0

Entschuldigung für die Verzögerung. Ich habe es nicht vergessen. Ich habe bei anderen Projekten einen kleinen Rückstand festgestellt. Ich sollte Zeit haben, mich heute Abend umzusehen. – guitarthrower

+0

kein Problem. Hier um zu helfen! –

Antwort

0

Die beste Lösung, die ich finden konnte, war die Verwendung von Sendkeys. Ich weiß, es ist weniger als ideal, aber ohne weiteres Feedback hier und mit meinem begrenzten Wissen ist es das Beste, was ich mir vorstellen kann. Ich habe diese Antwort akzeptiert, und wegen der Bounty-Anfrage kann ich die Annahme nicht rückgängig machen, aber wenn es hier eine bessere Idee gibt, und ich werde upvote und einen Kommentar hinterlassen, der besagt, dass es die Antwort ist.

Sub FillOutGoogleForm() 
    Application.ScreenUpdating = False 
    Dim IE As Object 
    Dim uname  As String 
    Dim ukey  As String 

    uname = Environ("username") 
    ukey = "00000-123kd-34kdkf-slkf" 

    Set IE = CreateObject("InternetExplorer.Application") 
    IE.Visible = True 

    While IE.busy 
     DoEvents 
    Wend 

    IE.navigate "http://spreadsheets.google.com/viewform?hl=en&pli=1&formkey=dHFTMzkwR2RpY2tzSUNnbVhIcDN3WWc6MA" 

    While IE.busy 
     DoEvents 
    Wend 

    SendKeys uname 
    While IE.busy 
     DoEvents 
    Wend 
    SendKeys "{TAB}", True 
    SendKeys ukey 
    While IE.busy 
     DoEvents 
    Wend 
    SendKeys "{TAB}", True 
    SendKeys "{ENTER}", True 
    SendKeys "%{F4}" 
    Application.ScreenUpdating = True 
End Sub 
2

Um dies zu vereinfachen, müssen Sie es in zwei Schritten brechen.

  1. Erarbeiten Sie genau, was Sie POST für Google Text & Tabellen benötigen. Ich würde Firebug oder ähnliches verwenden, um das herauszufinden. Ich vermute, es ist so etwas wie formkey, dann eine Reihe von Bereichen wie field1, field2 usw.

  2. Jetzt MSXML2 verwenden, um die Daten (Ive keine Ahnung, warum dies nicht als Code formatieren Erschienene) zu veröffentlichen.

    Set http = Create ("MSXML2.ServerXMLHTTP")

    myURL = "http://www.somedomain.com"

    http.Open "POST", myURL False

    http.setRequestHeader "User-Agent" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"

    http.send ("") '' // nicht sicher diese zusätzliche SEND benötigt wird .. wahrscheinlich nicht

    http.send ("formkey = Fd0SHgwQ3Yw & field1 = A & field2 = B")

    MsgBox http.responseText

+0

Wie kann ich Ihren Code verwenden, um in die Felder zu schreiben? Ich habe meine ursprüngliche Frage bearbeitet, um den Code von der Website, an die ich schreibe, einzuschließen. Vielen Dank. – guitarthrower

0

Google Apps Script ist derzeit nur für diejenigen zur Verfügung, die Google Apps-Konten (in der Regel Unternehmen) . Es gab viele Anfragen, a) auf diese über VBA zugreifen zu können und b) Nicht-Apps-Benutzern Zugriff zu gewähren - in den letzten 8 Monaten leider keine größeren Updates für diese Anfragen.

0

Mark Nold Antwort ist in der Regel korrekt, außer Sie lieber WinHTTP statt ServerXMLHTTP verwenden sollte, die den Umgang zu vermeiden Proxys usw.

Sie auch den Content-Type-Header in geeigneter Weise einzustellen. Dies sollte höchstwahrscheinlich "application/x-www-form-urlencoded" sein (mehr dazu hier: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4)

Schließlich müssen Sie die Daten mit dem Send() -Aufruf senden.

form_data = "entry.0.single=some_username&entry.1.single=some_key&pageNumber=0&backupCache=&submit=Submit" 
http.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
http.Send form_data 
0

go Editor

von Antworten wählen vorgefüllter url

fill in Feldnamen wie a1 a2 a3 a4 für die Antworten zu bilden, so dass Sie es später

dann die in sehen ändern die uRL von viewform formResponse wie:

https://docs.google.com/forms/d/123-ycyAMD4/viewform?entry.1237336855=a1.. 

zu

https://docs.google.com/forms/d/123-ycyAMD4/formResponse?entry.1237336855=a1... 

dann http get diese URL in irgendeiner Art und Weise wie:

Sub sendresult() 
dim a1,a2,a3 
a1="ans1"  
a2="ans2" 
a3="ans3" 


dim myURL 
myURL= "https://docs.google.com/forms/d/123-ycyAMD4/formResponse?" & _ 
"entry.1237336855=" & a1 & _ 
"&entry.2099352330=" & a2 & _ 
"&entry.962062701=" & a3 

dim http 
Set http= CreateObject("MSXML2.ServerXMLHTTP") 
http.Open "GET", myURL, False 
http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
http.send 
MsgBox http.responseText 

end sub 

volle Funktion i verwendet:

'http://stackoverflow.com/questions/2360153/use-excel-vba-to-fill-out-and-submit-google-docs-form/28079922#28079922 

Dim savedname 

Sub sendresult() 


Dim ScriptEngine 
Set ScriptEngine = CreateObject("MSScriptControl.ScriptControl") 
ScriptEngine.Language = "JScript" 
ScriptEngine.AddCode "function encode(str) {return encodeURIComponent(str);}" 

Dim name, points, times, t1, t2, t3, t4 

times = Sheet5.Range("C13").Value 

If times = "0" Or times = "" Then 
MsgBox "no data" 
Exit Sub 
End If 

If savedname = Empty Then savedname = InputBox("enter your name") 

name = ScriptEngine.Run("encode", savedname) 
points = Sheet5.Range("C12").Value 
t1 = Sheet5.Range("C7").Value 
t2 = Sheet5.Range("C8").Value 
t3 = Sheet5.Range("C9").Value 
t4 = Sheet5.Range("C10").Value 


Dim myURL 
myURL = "https://docs.google.com/forms/d/123-ycyAMD4/formResponse?" & _ 
"entry.1237336855=" & name & _ 
"&entry.2099352330=" & points & _ 
"&entry.962062701=" & times & _ 
"&entry.1420067848=" & t1 & _ 
"&entry.6696464=" & t2 & _ 
"&entry.1896090524=" & t3 & _ 
"&entry.1172632640=" & t4 


Dim http 
Set http = CreateObject("MSXML2.ServerXMLHTTP") 
http.Open "GET", myURL, False 
http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
http.send 
Dim resp 

If UBound(Split(http.responseText, "<div class=""ss-resp-message"">")) > 0 Then 
resp = Split(Split(http.responseText, "<div class=""ss-resp-message"">")(1), "</div>")(0) 
Else 
resp = "sent(with unexpected server response)" 
End If 
If resp = "Your response has been recorded." Then resp = "input received" 
MsgBox resp 


End Sub 
Verwandte Themen