Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use Excel VBA to fill out and submit Google Docs form

I'm trying to do something like this post but with Excel VBA. I would like to submit a response on a google docs form each time a button is pressed on an Excel add-in. The addin will be an XLA file and written in VBA.

I want to be able to collect what features the users are using. If someone has a better solution, I'm open.

---Edit---

This is the form I am trying to write to (excerpt of the code for one of the fields.)

<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-- This is what I've tried so far, but it is still not working. I am getting an error on the line that says ".UserName.Value = Environ("username")" I suspect it is because it is not finding the item .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
like image 788
guitarthrower Avatar asked Nov 05 '22 15:11

guitarthrower


1 Answers

To make this easy you need to break it into two steps.

  1. Work out exactly what the POST you need for Google Docs. I'd use Firebug or similar to work this out. I'm guessing it's something like formkey, then a bunch of fields like field1, field2 etc.

  2. Now use MSXML2 to POST the data (Ive no idea why this isnt appearing formatted as code).

    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 ("") ''// Not sure this additional SEND is needed.. probably not

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

    MsgBox http.responseText

like image 80
Mark Nold Avatar answered Nov 15 '22 05:11

Mark Nold