2009-12-03 14 views
8

Tengo una hoja de cálculo preexistente alojada en documentos de Google. Cada mes actualizo este documento. Tengo un workseet de plantilla en el conjunto expandido que me gustaría clonar y luego actualizar.Actualizando de forma programada una hoja de cálculo alojada en documentos de Google

Prefiero clonar la hoja de trabajo en lugar de crearla desde cero, ya que tiene algunas fórmulas bastante complejas.

estoy usando la API de Python para la documentación de Google aquí:

http://code.google.com/apis/spreadsheets/data/1.0/developers_guide_python.html

¿Alguien sabe cómo clonar y copiar una hoja de cálculo en un documento preexistente?

Editar

parecía que tenía confundidos un lector. No tengo una hoja de cálculo excel. Solo tengo una hoja de cálculo de Google Docs que tiene una hoja de trabajo de plantilla.

Me gustaría clonar esta hoja de trabajo, renombrarla y editarla programáticamente.

+1

@Priyank Bolia. No creo que entiendas Google Docs. No tengo una hoja de cálculo de Excel en absoluto. Solo tengo una hoja de cálculo de Google Docs. En esta hoja tengo una hoja de trabajo de la plantilla que me gustaría copiar, renombrar y luego editar. Me gustaría hacer esto programáticamente. – chollida

+0

¿Cómo resolvió este problema? – Tyug

+0

@Tyug No lo he resuelto. – chollida

Respuesta

6
  1. Clon su hoja de plantilla siguiendo las instrucciones de Copying Documents
  2. un acceso a la list of worksheets dentro del documento clonado y iterar a través de la hoja de cálculo requerida.
  3. Uso del cell feed para conseguir la celda correspondiente en la hoja de cálculo y, a continuación update los valores.
2

Esto es realmente complicado. Entiendo que puede editar sus hojas de cálculo con Python usando su API, Google tiende a ofrecer esa capacidad en muchos de sus servicios web y todo se hace mediante el envío de solicitudes HTTP de XML de alguna manera, espero que sepa esa parte, no lo hago t.

De acuerdo con this, al menos puede agregar hojas de trabajo, leer filas de otras hojas de trabajo y escribir filas en hojas de trabajo. si es necesario, puede copiarlo una fila a la vez, sin embargo, enviar una solicitud POST adicional para cada fila parece una idea horrible.

Editar:

estoy aprendiendo más y más sobre esto, pero todavía muy lejos de resolver el problema original. Este overview of REST principles repasa el estilo básico de interacción que se produce entre los programas en la web. Google parece seguirlo religiosamente.

Todo tiene lugar dentro del protocolo HTTP, algo de lo que no sabía nada antes de hoy. En este HTTP specification se explica el juego básico. No es tan seco como parece, y tal vez solo soy un gran friki, pero me parece una lectura inspiradora. No muy diferente a la Constitución de los Estados Unidos.

Por lo tanto, dado que desea "clonar" un documento, va a utilizar una solicitud GET para una hoja de cálculo en particular, y luego volver a enviar esa hoja de cálculo como la carga de POST.

Cada vez más cerca :)

1

No podrías puede exportar la hoja de cálculo como un xls y luego subirlo como un documento nuevo con un (ligeramente) nombre diferente, especificando el nombre nuevo en los metadatos XML?

Las secciones Descargar y cargar documento en http://code.google.com/apis/documents/overview.html deberían ser beneficiosas.

No puedo ver inmediatamente ninguna funcionalidad de importación/exportación en los documentos de la API de Python, pero el envío de algunas solicitudes http no es tan malo.

+0

He visto los documentos de descarga que ha publicado :) Gracias por su ayuda. – chollida

2

En primer lugar, nunca he trabajado con Python antes, pero le diré cómo lo hice en C++.

he utilizado cURL para realizar una solicitud GET a la google documents API. Se devolvieron los datos binarios del archivo y lo escribí en un archivo. Ahora tenía el archivo XLS y luego usé una biblioteca C/C++ que podía leer archivos XLS para manipular el archivo descargado. La API que utilicé admitió una variedad de opciones; podrías hacer cualquier cosa que pudieras hacer en Excel. Después de la modificación, la volví a cargar en Google Docs.

+0

Puaj, eso es de lo que tenía miedo. Supongo que funcionaría si pudiera cargar la copia local modificada con el mismo nombre que el original en línea. Gracias por su ayuda. – chollida

4

Whoa !!! Retrocede el camión. Hay un enfoque mucho más simple

He estado investigando esto un poco en las últimas semanas porque estoy planeando hacer lo mismo para mis informes mensuales. Todavía no tengo el código real, pero lo agregaré a medida que avance.

En Google Docs hay tantos de API y términos similares relacionados con el trabajo con documentos que las cosas pueden ser un poco confuso. Si aún no lo sabe, establezca en su cabeza el hecho de que GAS (Google Apps Scripting) y GAE (Google App Engine) son dos cosas completamente diferentes. A pesar de que suenan igual, son tan similares como Java a JavaScript.

GAS son los scrips incrustados en Google Docs (que con suerte serán importados como módulos independientes en el futuro) que manejan cosas como validación y documentos dinámicos pero son mucho más poderosos que la mayoría de sospechosos (pueden hacer cosas como modificar/actualizar documentos externos y respuestas de correo electrónico automático). Tenga en cuenta que estos deben ser livianos porque se ejecutan en los servidores de Google. Si el script tarda demasiado en terminar, su ejecución se cortará prematuramente (busque en Google los límites). Eso significa que debe usar vanilla JS solamente (sin marcos como jQuery) y ajustes de rendimiento siempre que sea posible.

GAE, por el contrario, es como un servidor web (con una capa de base de datos disponible) que vive en algún lugar de la nube. Existe como una capa de middleware conveniente (y ya implementada) para empresas/intereses para crear aplicaciones personalizadas para hacer más trabajo pesado. Desafortunadamente, la API externa de la hoja de cálculo es demasiado limitada para lograr lo que estamos trabajando por sí misma, por lo que no es una opción.

de automatización a través de Google Apps de secuencias de comandos y disparadores basados ​​en el tiempo

Este enfoque debe trabajo, sino que requiere un enfoque ligeramente hacker.

Abra el libro de trabajo que contiene sus hojas de informe. Haga clic en [Herramientas] -> [Editor de scripts ...]. Una vez allí, vaya a [Desencadenantes] -> [Desencadenadores del guión actual ...].

Si usted no tiene ningún activador presentes, agrega uno. Luego, debajo del menú desplegable 'Eventos', seleccione 'Basado en el tiempo'.

Bienvenido al mundo de los controladores de eventos del lado del servidor. Una de las mejores características que obtienes con los documentos basados ​​en la nube es la capacidad de desencadenar trabajos cron directamente en tu documento. No es necesario middleware externo.

Si todavía no lo ha notado, no hay ningún disparador para 'Temporizador de mes'. Aquí es donde se vuelve hacky. Para evitar la falta de esta función, se requerirá que activemos el activador diariamente y usemos JavaScript para hacer coincidir la fecha actual con la fecha del día anterior.

[código irá aquí]

En primer lugar, viene la función que se apega al controlador de eventos de disparo de tiempo. Este bloque de código simplemente analiza la fecha, la compara con la fecha anterior y almacena el valor en una hoja oculta (que usamos como capa de persistencia) para la comparación del día siguiente. Si se cumple la condición de nuevo mes, se ejecuta el siguiente bloque de código.

[código irá aquí]

Suyo, obviamente, serán diferentes de la mía un poco, pero el concepto básico es:

  • de carga en dicho objeto (que no debe confundirse con un objeto de hoja)
  • Busque el objeto Hoja de plantilla
  • Clone la Hoja de plantilla dándole un nombre basado en la fecha-rango apropiado

En el mío, mi siguiente paso será extraer datos del mes para generar un gráfico de líneas apiladas para informar el estado actual a mis superiores.

Nota: debido a la naturaleza de colaboración de usuarios múltiples de los documentos, los eventos tienen que activarse en el servidor. Esto crea un gran problema para nosotros. Debido a que el código del evento se ejecuta en otro lugar si el código falla, no obtenemos ningún comentario de nuestro navegador. La única solución para esto es configurar una notificación en el desencadenador para enviarle un correo electrónico de inmediato cuando el script falle.

Actualización: Mientras investigaba esto, encontré otra técnica genial. Si puedo lograr que esto funcione sin errores, podría intentar invocar el desencadenante usando una fecha marcada en Google Calendar.

0

(Feb 2017) reformular la pregunta con la terminología actual: ¿Cómo copiar una plantilla Hoja de Google, a continuación, modificarlo (la copia) mediante programación? Respuesta breve: es mucho más fácil con las API actuales de Google, específicamente con Google Drive v3 API y Google Sheets v4 API, y puede hacerlo con cualquier idioma admitido por Google APIs Client Libraries.

La última API de hojas proporciona características no disponibles en versiones anteriores, es decir, dando a los desarrolladores el acceso mediante programación a una hoja como si estuviera utilizando la interfaz de usuario (UI), es decir, crear filas, de formato de celda, cambiar el tamaño de filas/columnas congeladas, añadir tablas dinámicas, validación de celda, crear gráficos, etc.

como se puede adivinar, la API de hojas es principalmente para el acceso mediante programación operaciones de hojas de cálculo & funcionalidad como se describe anteriormente, pero para llevar a cabo archivo -level acceso como copiando una hoja de plantilla, use el Google Drive API en su lugar.

Pseudocódigo (Python) para copiar un archivo (Hoja) mediante la API de Drive (suponiendo que primero buscar el archivo modificado más recientemente con el nombre de la plantilla, de ahí el orderBy y selección del primer resultado [0] abajo):

TMPLFILE = 'my Sheets template' 
tmpl = DRIVE.files().list(q="name='%s'" % TMPLFILE).execute().get('files')[0] 
NEW_SHEET = {'name': 'Sheets data, Feb 2017'} 
SHEET_ID = DRIVE.files().copy(body=NEW_SHEET, fileId=tmpl['id']).execute().get('id') 

Pseudocódigo para leer los valores de una base de datos SQL (SQLite) y escribirlos en la nueva hoja creada anteriormente (a partir de la célula 'A1' como "superior izquierda") como si un usuario ha introducido los valores de la interfaz de usuario (para que se puedan aplicar fórmulas, etc.):

cxn = sqlite3.connect('db.sqlite') 
cur = cxn.cursor() 
rows = cur.execute('SELECT * FROM data').fetchall() 
cxn.close() 
DATA = {'values': rows} 
SHEETS.spreadsheets().values().update(spreadsheetId=SHEET_ID, 
    range='A1', body=DATA, valueInputOption='USER_ENTERED').execute() 

Si es relativamente nuevo en las API de Google modernas, tengo un intro video (algo anticuado pero fácil de usar) fácil para usted. Después de eso, hay 2 videos que también pueden ser útiles, incluido uno que demuestra el uso de Drive API. Esos son los videos 2, 3 y 4 en this playlist. Los videos 23 & 25 son otro par que presenta las API Drive y Sheets.

Todos los vídeos más recientes se pueden encontrar en this playlist donde encontrará otro par de videos con las hojas de API más una repetición del código "copiado del molde", pero por encima de la copia de una plantilla de diapositivas que luego se modifica con el Slides API) en lugar (video 2).

Como se menciona en otra respuesta, también puede usar Google Apps Script para hacer algo similar si prefiere ese entorno en comparación con el uso de API REST, aunque Apps Script actualmente usa API antiguas. También hay algunos errores pendientes que pueden hacer que sea un poco más desafiante (específicamente this one y this one).

Cuestiones relacionadas