2010-03-02 7 views
5

J'essaie de faire quelque chose comme this post mais avec Excel VBA. Je souhaite soumettre une réponse sur un formulaire google docs à chaque fois qu'un bouton est appuyé sur un complément Excel. L'addin sera un fichier XLA et écrit en VBA.Utilisez Excel VBA pour remplir et soumettre le formulaire Google Docs

Je veux être en mesure de collecter les fonctionnalités que les utilisateurs utilisent. Si quelqu'un a une meilleure solution, je suis ouvert.

--- --- Modifier

This est la forme que je suis en train d'écrire (extrait du code pour l'un des champs.)

<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-- C'est ce que j'ai essayé jusqu'à présent, mais ça ne marche toujours pas. Je reçois une erreur sur la ligne qui dit ".UserName.Value = Environ (" nom d'utilisateur ")" Je soupçonne que c'est parce qu'il ne trouve pas l'article .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: voulais juste vérifier pour voir si la réponse ci-dessous les réponses ta question. –

+0

Désolé pour le retard. Je n'ai pas oublié. J'ai rencontré un peu d'arriéré sur d'autres projets. Je devrais avoir le temps d'y jeter un coup d'œil ce soir. – guitarthrower

+0

pas de problème. Ici pour aider! –

Répondre

0

La meilleure solution que j'ai pu trouver était d'utiliser sendkeys. Je sais que c'est loin d'être idéal, mais sans aucun autre commentaire ici, et avec mes connaissances limitées, c'est mieux que je pourrais trouver. J'ai accepté cette réponse, et à cause de la demande de prime, je ne peux pas annuler l'acceptation, mais s'il y a une meilleure idée poste ici et et je vais upvote et laisser un commentaire indiquant que c'est la réponse.

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

Pour faciliter la tâche, vous devez le diviser en deux étapes.

  1. Déterminez exactement le POST dont vous avez besoin pour Google Documents. J'utiliserais Firebug ou similaire pour résoudre ce problème. Je devine que c'est quelque chose comme formkey, puis un tas de domaines comme field1, field2 etc.

  2. utiliser maintenant MSXML2 pour afficher les données (Ive aucune idée pourquoi ce isnt formaté code apparaissant).

    Set http = CreateObject ("MSXML2.ServerXMLHTTP")

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

    http.Open "POST", myURL, Faux

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

    http.send ("") '' // Je ne sais pas ce SEND supplémentaire est nécessaire .. probablement pas

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

    MsgBox http.responseText

+0

Comment puis-je utiliser votre code pour écrire dans les champs? J'ai édité ma question originale pour inclure le code du site que j'écris. Merci. – guitarthrower

0

Google Apps Script est actuellement disponible uniquement pour ceux qui ont des comptes Google Apps (généralement des entreprises) . Il y a eu beaucoup de demandes pour a) être en mesure d'accéder à ce via VBA et b) permettre aux utilisateurs non-Apps d'avoir accès - pas de mises à jour majeures de ces demandes au cours des 8 derniers mois malheureusement.

0

La réponse de Mark Nold est généralement correcte sauf que vous devez plutôt utiliser WinHTTP au lieu de ServerXMLHTTP pour éviter d'avoir à traiter définir des proxy, etc.

a également fixé l'en-tête Content-Type approprié. Cela devrait très probablement être "application/x-www-form-urlencoded" (plus sur cela ici: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4)

Enfin vous devez envoyer les données avec dans l'appel 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

go pour former éditeur

de réponses choisir url prérempli

remplissage dans les noms de domaine comme a1 a2 a3 a4 pour les réponses que vous le verrez plus tard

puis modifiez les en l'url de viewform pour formerResponse comme:

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

à

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

alors http obtenir cette URL en quelque sorte comme:

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 

fonctions i utilisé:

'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 
Questions connexes