2010-03-02 5 views
5

Sto provando a fare qualcosa come this post ma con Excel VBA. Vorrei inviare una risposta su un modulo Google Documenti ogni volta che viene premuto un pulsante su un componente aggiuntivo di Excel. L'addin sarà un file XLA e scritto in VBA.Usa VBA di Excel per compilare e inviare il modulo di Google Documenti

Desidero essere in grado di raccogliere le funzionalità utilizzate dagli utenti. Se qualcuno ha una soluzione migliore, sono aperto.

--- --- Modifica

This è la forma che sto cercando di scrivere a (estratto del codice per uno dei campi.)

<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-- Questo è quello che ho provato fino ad ora, ma non funziona ancora. Sto ricevendo un errore sulla riga che dice ". UserName.Value = Environ (" username ")" Sospetto che sia perché non trova l'oggetto .username.

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: voleva solo il check-in per vedere se la risposta di seguito le risposte la tua domanda. –

+0

Ci scusiamo per il ritardo. Non ho dimenticato Ho incontrato un po 'di arretrato su altri progetti. Dovrei avere il tempo di dare un'occhiata a questo stasera però. – guitarthrower

+0

nessun problema. qui per aiutare! –

risposta

0

La soluzione migliore che ho trovato è stata l'utilizzo di sendkeys. So che non è l'ideale, ma senza alcun altro feedback qui, e con le mie conoscenze limitate è meglio che io possa venire con. Ho accettato questa risposta e, a causa della generosa richiesta, non posso annullare l'accettazione, ma se c'è un'idea migliore post qui e io risparmierò e lascerò un commento affermando che è la risposta.La risposta di

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

Per semplificare, è necessario suddividerlo in due passaggi.

  1. Calcolare esattamente il POST di cui hai bisogno per Google Documenti. Userò Firebug o simili per risolvere questo problema. Sto indovinando è qualcosa di simile formkey, poi un gruppo di campi come field1, field2 ecc

  2. Ora usare MSXML2 POST i dati (Ive idea del perché questo non è apparendo formattato come codice).

    Set http = CreateObject ("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 ("") '' // non è sicuro è necessaria questa ulteriore INVIA .. probabilmente non

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

    MsgBox http.responseText

+0

Come posso usare il tuo codice per scrivere nei campi? Ho modificato la mia domanda originale per includere il codice dal sito in cui sto scrivendo. Grazie. – guitarthrower

0

Google Apps Script è attualmente disponibile solo per coloro che hanno un account Google Apps (di solito le aziende) . Ci sono state molte richieste per a) essere in grado di accedere a questo tramite VBA eb) consentire agli utenti non-Apps di avere accesso - senza grandi aggiornamenti a queste richieste negli ultimi 8 mesi, sfortunatamente.

0

Mark Nold è generalmente corretto tranne che si dovrebbe piuttosto utilizzare WinHTTP invece di ServerXMLHTTP per evitare di trattare con dover impostare proxy ecc

impostato anche l'intestazione Content-Type in modo appropriato. Molto probabilmente dovrebbe essere "application/x-www-form-urlencoded" (altro su questo: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4)

Infine, è necessario inviare i dati con la chiamata Send().

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

vanno a formare editor di

dalle risposte scegliere url preriempita

riempimento nei nomi dei campi come A1 A2 A3 A4 per le risposte così potrete vedere in un secondo momento

quindi modificare l'in l'url da viewform a formRispondente come:

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

a

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

poi http ottenere questo URL in qualche modo simile:

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 

funzione completa che ho usato:

'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