Usar Android para enviar a un Formulario de hoja de cálculo de Google

Primera vez haciendo una pregunta aquí. Por lo general, puedo encontrar mi respuesta sin tener que preguntar, pero esta vez estoy atascado y no puedo entender lo que me estoy perdiendo.

Solo bash que mi aplicación de Android complete un formulario en un sitio web y lo envíe. No necesito que la aplicación haga nada con los datos que se envían, solo complete el formulario y envíelo. Básicamente, estoy tratando de recostackr los resultados de una aplicación de votación. Pensé que la presentación del formulario sería simple, así que creé una hoja de cálculo de Google e hice un formulario con ella. Pensé que apuntaría la aplicación de Android al formulario y luego tendría todos los datos en la hoja de cálculo para verlos más tarde. Sin embargo, no puedo conseguir que la aplicación de Android llene el formulario. Aquí están los recursos.

Formar

Hoja de cálculo

private void submitVote(String outcome) { HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ&ifq"); List results = new ArrayList(); results.add(new BasicNameValuePair("entry.0.single", cardOneURL)); results.add(new BasicNameValuePair("entry.1.single", outcome)); results.add(new BasicNameValuePair("entry.2.single", cardTwoURL)); try { post.setEntity(new UrlEncodedFormEntity(results)); } catch (UnsupportedEncodingException e) { // Auto-generated catch block Log.e("YOUR_TAG", "An error has occurred", e); } try { client.execute(post); } catch (ClientProtocolException e) { // Auto-generated catch block Log.e("YOUR_TAG", "An error has occurred", e); } catch (IOException e) { // Auto-generated catch block Log.e("YOUR_TAG", "An error has occurred", e); } } 

Hice público el formulario y la hoja de cálculo, así que no dude en meterse con eso y tratar de que funcione.

No recibo errores de mi progtwig, no hay errores de comstackción, no hay errores en DDMS. Cuando realmente ejecuto el progtwig y hago clic en el botón que ejecuta este código, puedo ver el retraso ya que ahora está en el hilo de UI, así que sé que lo está ejecutando. Parece que todo está funcionando perfectamente, pero mi hoja de cálculo no se actualiza en absoluto.

¿Alguna idea? Estoy seguro de que es algo estúpido que me estoy perdiendo, pero cualquier ayuda sería apreciada.

Aquí está el código actualizado con muchas cosas de registro y depuración.

 private void submitVote(String outcome) { HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ&ifq"); List results = new ArrayList(); results.add(new BasicNameValuePair("entry.0.single", cardOneURL)); results.add(new BasicNameValuePair("entry.1.single", outcome)); results.add(new BasicNameValuePair("entry.2.single", cardTwoURL)); try { post.setEntity(new UrlEncodedFormEntity(results)); } catch (UnsupportedEncodingException e) { // Auto-generated catch block Log.e("YOUR_TAG", "An error has occurred", e); } try { HttpResponse httpResponse = client.execute(post); Log.e("RESPONSE", "info: " + httpResponse); BufferedReader rd = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent())); String line; while ((line = rd.readLine()) != null) { Log.i("words", line); } Intent intent = new Intent(this, ReadingView.class); intent.putExtra("html", line); startActivity(intent); } catch (ClientProtocolException e) { // Auto-generated catch block Log.e("YOUR_TAG", "client protocol exception", e); } catch (IOException e) { // Auto-generated catch block Log.e("YOUR_TAG", "io exception", e); } } 

Uso ReadingView.class para otra cosa en mi aplicación, pero lo secuestro para este propósito de registro en este momento. Solo tiene un método onCreate (), que se encuentra debajo.

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.readingview); WebView mWebView = (WebView) findViewById(R.id.webview); mWebView.getSettings().setJavaScriptEnabled(true); //mWebView.loadUrl(getIntent().getExtras().getString("url")); mWebView.loadData(getIntent().getExtras().getString("html"), "text/html", "utf-8"); } 

También vale la pena señalar que en el DDMS solo registra una salida de línea. Creo que esto es solo porque el código html se devuelve todo como una sola línea. Corrígeme si estoy equivocado.

Así que finalmente descubrí lo que estaba pasando. Al jugar con la encoding manual de las respuestas al final de la URL POST del formulario, pude encontrar que la URL que proporcionaba al ver la fuente tenía problemas de encoding propios.

Aquí está la url de la fuente:

 

Pero esto es lo que debe ser para funcionar realmente en el código anterior:

 https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ 

El amplificador extra; era lo que estaba estropeando. Por alguna razón, funciona sin el último & ifq también, así que lo dejé. De todos modos, aquí está el código completo:

 private void submitVote(String outcome) { HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ"); List results = new ArrayList(); results.add(new BasicNameValuePair("entry.0.single", cardOneURL)); results.add(new BasicNameValuePair("entry.1.single", outcome)); results.add(new BasicNameValuePair("entry.2.single", cardTwoURL)); try { post.setEntity(new UrlEncodedFormEntity(results)); } catch (UnsupportedEncodingException e) { // Auto-generated catch block Log.e("YOUR_TAG", "An error has occurred", e); } try { client.execute(post); } catch (ClientProtocolException e) { // Auto-generated catch block Log.e("YOUR_TAG", "client protocol exception", e); } catch (IOException e) { // Auto-generated catch block Log.e("YOUR_TAG", "io exception", e); } } 

Espero que esto ayude a alguien más cuando intente trabajar con Formularios de hoja de cálculo de Google. Y gracias a @pandre por señalarme en la dirección correcta.

El formato, entry.0.single podría no funcionar en muchos casos. Siempre debe encontrar la identificación adecuada de los elementos para crear su solicitud POST. Este artículo proporciona la forma correcta de publicar datos en una hoja de documentos de Google a través de la aplicación de Android.

Echa un vistazo a la fuente de Acra . Esto carga rastreos de stack a una hoja de cálculo de Google.

Probablemente no esté viendo errores porque está imprimiendo excepciones de forma incorrecta.
Está utilizando e.printStackTrace(); que no aparece en DDMS / Logcat.

Deberías usar en su lugar
Log.e("YOUR_TAG, "An error has occurred", e);

que registrará su error en DDMS / Logcat. Debería ver el stacktrace de la excepción y le ayudará a comprender qué sucede.

EDITAR: ¿Ha comprobado lo que se devuelve en client.execute(post); ?
Debería verificar lo que se devuelve en la respuesta POST haciendo:

 HttpResponse httpResponse = client.execute(post); 

También puede ejecutar la aplicación en modo de depuración y verificar dónde se bloquea / se detiene.

Así que los cardOneUrl’s son campos de edición de texto en un layout.xml “results.add (new BasicNameValuePair (” entry.0.single “, cardOneURL));” Gracias, Joe