Blog

Editar spreadsheet (hojas de cálculo) de google con php
agosto 20, 2015 | en Php, Spreadsheets

Editar spreadsheet (hojas de cálculo) de google con php

En este artículo voy a intentar explicar como podemos agregar filas de datos que se encuentran en una hoja de cálculo de Google ( Google Spreadsheets ) mediante php.

Esto puede ser particularmente útil para por ejemplo guardar los datos de los visitantes de una web que completan y envían sus datos a través de un formulario de contacto.

Decidí hacer este artículo porque no me resultó en un principio fácil de entender como poder realizarlo y tardé más tiempo del esperado, así que quizás alguien este en el mismo camino que yo estuve y esta explicación le resulte de utilidad y le ahorre bastante tiempo de trabajo.

Vamos a utilizar dos librarías:

– La librería de cliente de google api para php https://github.com/google/google-api-php-client

– Una librería que nos provee una interface a Google Spreadsheet API: https://github.com/asimlqt/php-google-spreadsheet-client

Para instalar estas librerías vamos a utilizar Composer tal como lo recomienda cada una de ellas en su documentación. Composer es un manejador de dependencias para PHP y sirve para administrar librerías de terceros o propias en nuestros proyectos de PHP. Este tutorial excede el uso de Composer, pero hay mucha documentación en Internet que explica en detalle su funcionalidad, instalación y su uso. Es muy fácil de utilizar y muy útil.

Una vez instalado Composer en nuestro proyecto debemos editar el archivo composer.json para que instale las librerias requeridas, el json quedaría asi:

{
    "name": "Php & SpreadSheet",
    "description": "Agregar fila al Spreadsheet con php.",
    "authors": [
    {
     "name": "Jose Luis",
     "email": "info@example.com"
    }
    ],
   "require": {
     "asimlqt/php-google-spreadsheet-client": "2.3.*",
      "google/apiclient": "1.0.*@beta"
   }
}

Luego hacemos un “Install” al Composer de nuestro proyecto, y con eso ya tenemos las librerías instaladas listas para su utilización.

Obviamente necesitamos tener una cuenta de Google creada, y en nuestro Google Drive crearemos un Spreadsheet  (Hojas de cálculo de Google) para nuestro ejemplo y la llemaremos “PHP & Spreadsheets“, y agregaremos 3 cabeceras de columnas: Nombre, Email y Teléfono. A la hoja de cálculo la vamos a renombrar con el nombre “Usuarios”  tal como lo muestra la imagen.

speadsheet-1

El API de Google nos permite interactuar con nuestra hoja de calculo a través de PHP, utilizando OAuth 2.0 protocol para la autenticación y la autorización. Antes que nuestra aplicación pueda acceder al Spreadsheet generado debemos obtener un “Access Token” que otorga el acceso.

Para empezar debemos obtener las credenciales de OAuth 2.0. Para esto debemos ir a Google Developers Console y crear un nuevo proyecto, en este caso lo llamaremos “Php-Spreadsheet

nuevo-proyecto

Una vez creado el proyecto se debe ir a la sección credenciales y añadir nueva credencial, en este caso añadir “Cuenta de servicio“, en tipo de clave seleccionamos P12. Se nos va a descargar un archivo con extension P12 , este archivo nos va a proporcionar la clave privada cuando solicitamos un token de acceso OAuth 2.0 asique es necesario tenerlo en un lugar que sea seguro.

Luego vamos a “Credenciales” y hacemos click sobre la cuenta de servicio que recién creamos y vamos a poder ver nuestro ID Cliente y la Dirección de correo electrónico con la que nos vamos a conectar.

idcliente-correo

Ya tenemos todos los datos necesarios para crear nuestro proyecto en PHP, debemos tomar nota del Id de Cliente y la direccion de correo electrónico que nos muestra la cuenta de servicio (imagen de arriba).

Ahora debemos ir nuevamente a nuestro Spreadsheet llamado en nuestro ejemplo “PHP & Spreadsheets” y compartirlo con la dirección de email que anotamos anteriormente de la cuenta de servicio generada, debo decir que este paso personalmente me llevo bastante tiempo darme cuenta que lo tenías que hacer.

compartir-spreadsheet

Otra cosa que debemos definir es el “scope”, que es un parámetro que controla el conjunto de recursos y operaciones que da permiso el token de acceso que generamos. En nuestro ejemplo este parámetro lo debemos definir como: https://spreadsheets.google.com/feeds

Con todo esto ya podemos volver a nuestro proyecto de PHP que ya tiene las dos librerías que vamos necesitar instadas a través de Composer. Nuestro indes.php quedaría de la siguiente manera.


// Composer's auto-loading functionality
require "vendor/autoload.php";

use Google\Spreadsheet\DefaultServiceRequest;
use Google\Spreadsheet\ServiceRequestFactory;

//
/*
 * Aquí van los datos de la sección credenciales del proyecto que creamos con Google Console
 * Modificarlos según su propia direccion de correo y Id de cliente
 */
$nombreAplicacion = "Php-Spreadsheet";
$direccionCorreo = "Direccion de correo";
$idCliente = "ID de Cliente"; 

// Nombre del SpreadSheet creada
$nombreSpreahSheet = "PHP & Spreadsheets";
// Nombre de hoja de cálculo
$hojaCalculo = "Usuarios";

$scope = array('https://spreadsheets.google.com/feeds');

// Inicializamos Google Client
$client = new Google_Client();
$client->setApplicationName($nombreAplicacion);
$client->setClientId($idCliente);

// credenciales, scope y archivo p12. Agregar el correcto Path al archivo p12
$cred = new Google_Auth_AssertionCredentials(
 $direccionCorreo,
 $scope,
 file_get_contents('PATH TO P12 file')
);

$client->setAssertionCredentials($cred);

// si expiro el access token generamos otro
if($client->isAccessTokenExpired()) {
 $client->getAuth()->refreshTokenWithAssertion($cred);
}

// Obtenemos el access token
$obj_token = json_decode($client->getAccessToken());
$accessToken = $obj_token->access_token;

// Inicializamos google-spreadsheet-client
$serviceRequest = new DefaultServiceRequest($accessToken);
ServiceRequestFactory::setInstance($serviceRequest);

//Obtenemos los Spreadsheets disponibles para las credenciales actuales
$spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
$spreadsheetFeed = $spreadsheetService->getSpreadsheets();

// Obtenemos la spreadsheet por su nombre
$spreadsheet = $spreadsheetFeed->getByTitle($nombreSpreahSheet);

// Obtenemos las hojas de cálculo de la spreadsheet obetenida
$worksheetFeed = $spreadsheet->getWorksheets();

// Obtenemos la hoja de cálculo por su nombre
$worksheet = $worksheetFeed->getByTitle($hojaCalculo);
$listFeed = $worksheet->getListFeed();

/*
 * Array de datos a agregar. 
 * Observar que el valor de la claves del array que representan los encabezados 
 * de las columnas van en minúsculas, en vez de Email sería email. 
 * Esto es porque los encabezados de columna deben coincidir exactamente 
 * con lo que fue devuelto por la API de Google y no por lo que se ve en Google Drive.
 */

 $dataAgregar = array('nombre' => 'Juan',
 'email' => 'Martinez',
 'telefono' => '1567890'
 );

// Agregar datos
$listFeed->insert($dataAgregar);

El resultado sería:

datosagregados

Esta de más decir que podríamos crear una clase para que este proyecto PHP sea más escalable y facil de utilizar. Pero esto ya queda como tarea para el lector.

Para finalizar pueden descargar el código fuente de este proyecto haciendo click aquí

comments powered by Disqus