{"id":28996,"date":"2021-06-05T14:41:00","date_gmt":"2021-06-05T11:41:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28996"},"modified":"2021-10-17T16:27:18","modified_gmt":"2021-10-17T13:27:18","slug":"escribir-datos-en-la-hoja-de-onedrive-usando-microsoft-graph-api-y-php","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/es\/escribir-datos-en-la-hoja-de-onedrive-usando-microsoft-graph-api-y-php\/","title":{"rendered":"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP"},"content":{"rendered":"<p>Recientemente, publiqu\u00e9 un art\u00edculo <a href=\"https:\/\/themewp.inform.click\/es\/como-integrar-la-api-de-google-sheets-con-php\/\" title=\"C\u00f3mo integrar la API de Google Sheets con PHP\" >C\u00f3mo integrar la API de Google Sheets con PHP<\/a> donde expliqu\u00e9 c\u00f3mo escribir datos en la hoja de Google utilizando PHP y las API de Google. Uno de los lectores pregunt\u00f3 de manera similar c\u00f3mo escribir datos en la Hoja de OneDrive. En este tutorial, estudiaremos c\u00f3mo usar Microsoft Graph API y PHP para escribir los datos en la hoja de OneDrive.<\/p>\n<p>La API de Microsoft Graph sigue el flujo de OAuth para la autorizaci\u00f3n. Eso significa que necesitamos generar un token de acceso utilizando el proceso OAuth. Para ello, primero debe registrar la aplicaci\u00f3n y obtener sus credenciales.<\/p>\n<h3>Registre una aplicaci\u00f3n y cree credenciales<\/h3>\n<p>Al integrar un proceso de OAuth, debe tener una identificaci\u00f3n de cliente y un secreto de cliente. Lo obtendr\u00e1 despu\u00e9s de registrar las aplicaciones. Uno puede seguir los pasos mencionados en <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/active-directory\/develop\/quickstart-register-app\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta p\u00e1gina<\/a> y registrar su aplicaci\u00f3n con Microsoft.<\/p>\n<p>Inicie sesi\u00f3n en <a href=\"https:\/\/portal.azure.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Azure Portal<\/a> y luego busque Registro de aplicaciones. Rellena el formulario. Debe pasar una URL al campo Redirigir URI. A este campo, le estoy pasando una URL de servidor local. Crear\u00e9 un <code>callback.php<\/code>en los siguientes pasos. He completado los detalles como se muestra en la captura de pantalla a continuaci\u00f3n.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b181786.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b181786.png\" alt=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\" ><\/a><\/p>\n<p>Al enviar un formulario, obtendr\u00e1 el ID de cliente de la pesta\u00f1a Descripci\u00f3n general.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b219158.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b219158.png\" alt=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\" ><\/a><\/p>\n<p>A continuaci\u00f3n, vaya a la pesta\u00f1a &#8216;Certificados y secretos&#8217; y haga clic en &#8216;Nuevo secreto de cliente&#8217;.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" alt=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\" ><\/a><\/p>\n<p>Se abrir\u00e1 una ventana emergente donde debe agregar una descripci\u00f3n y elegir la opci\u00f3n Caduca.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" alt=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\" ><\/a><\/p>\n<p>Despu\u00e9s de esto, obtendr\u00e1 su secreto de cliente como se muestra a continuaci\u00f3n.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" alt=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\" ><\/a><\/p>\n<h4>Instalar paquetes requeridos<\/h4>\n<p>Tenemos que integrar dos cosas: OAuth y REST API. Para OAuth, <a href=\"https:\/\/hybridauth.github.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">usar\u00e9 la<\/a> biblioteca <a href=\"https:\/\/hybridauth.github.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Hybridauth<\/a>. Y para interactuar con la API de Microsoft Graph, usemos la biblioteca <a href=\"https:\/\/docs.guzzlephp.org\/en\/stable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Guzzle<\/a>.<\/p>\n<p>Podemos instalar f\u00e1cilmente estos 2 paquetes usando un Compositor. Cree un <code>composer.json<\/code>archivo en el directorio ra\u00edz de su proyecto y agr\u00e9guele las siguientes l\u00edneas.<\/p>\n<pre><code>{\n\u00a0\u00a0\u00a0\u00a0\"require\": {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"hybridauth\/hybridauth\": \"~3.0\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"guzzlehttp\/guzzle\": \"^7.0\"\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>Ejecute el comando a continuaci\u00f3n que instalar\u00e1 estos paquetes.<\/p>\n<pre><code>composer install<\/code><\/pre>\n<p>Como se dijo, la API de Microsoft Graph usa OAuth para realizar las operaciones de la API. Requiere que genere un token de acceso que act\u00faa como un identificador de su cuenta. Con este token de acceso, las API de Microsoft Graph validan si la solicitud entrante es v\u00e1lida y est\u00e1 autorizada.<\/p>\n<p>El token de acceso tiene una vida corta. Caducan pronto. Y una vez caducado, no podemos hacer llamadas a la API ya que Microsoft trata la solicitud con el token caducado como una solicitud no autorizada. Para resolver este problema, usamos el &#8216;refresh_token&#8217; para regenerar el token de acceso en segundo plano. As\u00ed es como funciona OAuth.<\/p>\n<h3>Configuraci\u00f3n de la base de datos<\/h3>\n<p>Para lograr nuestro objetivo, debemos almacenar el token en un lugar seguro. Necesitamos el token mientras llamamos a las API. Adem\u00e1s, deber\u00eda regenerarse despu\u00e9s de su vencimiento. Entonces, para almacenar los detalles del token, cree una tabla de base de datos de la siguiente manera.<\/p>\n<pre><code>CREATE TABLE `token` (\u00a0`id` int(11) NOT NULL AUTO_INCREMENT,\n\u00a0`access_token` text NOT NULL,\n\u00a0PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;<\/code><\/pre>\n<p>Insertaremos el token en la base de datos despu\u00e9s de completar el proceso de autorizaci\u00f3n. Adem\u00e1s, actualizaremos el token en segundo plano. Para esto, voy a crear una clase de base de datos para que podamos hacer f\u00e1cilmente las operaciones de inserci\u00f3n, selecci\u00f3n y actualizaci\u00f3n.<\/p>\n<p><strong>class-db.php<\/strong><\/p>\n<pre><code>&lt;?php\nclass DB {\n\u00a0\u00a0\u00a0\u00a0private $dbHost\u00a0\u00a0\u00a0\u00a0 = \"DB_HOST\";\n\u00a0\u00a0\u00a0\u00a0private $dbUsername = \"DB_USERNAME\";\n\u00a0\u00a0\u00a0\u00a0private $dbPassword = \"DB_PASSWORD\";\n\u00a0\u00a0\u00a0\u00a0private $dbName\u00a0\u00a0\u00a0\u00a0 = \"DB_NAME\";\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function __construct(){\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(!isset($this-&gt;db)){\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Connect to the database\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$conn = new mysqli($this-&gt;dbHost, $this-&gt;dbUsername, $this-&gt;dbPassword, $this-&gt;dbName);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if($conn-&gt;connect_error){\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0die(\"Failed to connect with MySQL: \". $conn-&gt;connect_error);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}else{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;db = $conn;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function is_table_empty() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$result = $this-&gt;db-&gt;query(\"SELECT id FROM token\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if($result-&gt;num_rows) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return false;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return true;\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function get_access_token() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$sql = $this-&gt;db-&gt;query(\"SELECT access_token FROM token\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$result = $sql-&gt;fetch_assoc();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return json_decode($result['access_token']);\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function get_refersh_token() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$result = $this-&gt;get_access_token();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return $result-&gt;refresh_token;\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0public function update_access_token($token) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if($this-&gt;is_table_empty()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;db-&gt;query(\"INSERT INTO token(access_token) VALUES('$token')\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;db-&gt;query(\"UPDATE token SET access_token = '$token' WHERE id = (SELECT id FROM token)\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<h3>Generar token de acceso<\/h3>\n<p>Una vez que est\u00e9 listo con los paquetes requeridos y la clase de base de datos, la siguiente parte es realizar la autenticaci\u00f3n y almacenar los detalles del token en la base de datos.<\/p>\n<p>La biblioteca Hybridauth proporciona su propio proceso para realizar la autorizaci\u00f3n. Entonces, sig\u00e1moslos. Cree un <code>config.php<\/code>archivo y agregue el siguiente c\u00f3digo en \u00e9l.<\/p>\n<p><strong>config.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'vendor\/autoload.php';\nrequire_once 'class-db.php';\n\u00a0\ndefine('ONEDRIVE_CLIENT_ID', 'CLIENT_ID_HERE');\ndefine('ONEDRIVE_CLIENT_SECRET', 'CLIENT_SECRET_HERE');\ndefine('ONEDRIVE_SCOPE', 'files.read files.read.all files.readwrite files.readwrite.all offline_access');\ndefine('ONEDRIVE_CALLBACK_URL', 'CALLBACK_URL_HERE'); \/\/ in my case it is http:\/\/localhost\/sajid\/onedrive\/callback.php\n\u00a0\n$config = [\n\u00a0\u00a0\u00a0\u00a0'callback' =&gt; ONEDRIVE_CALLBACK_URL,\n\u00a0\u00a0\u00a0\u00a0'keys'\u00a0\u00a0\u00a0\u00a0 =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'id' =&gt; ONEDRIVE_CLIENT_ID,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'secret' =&gt; ONEDRIVE_CLIENT_SECRET\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0'scope'\u00a0\u00a0\u00a0 =&gt; ONEDRIVE_SCOPE,\n\u00a0\u00a0\u00a0\u00a0'authorize_url_parameters' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'approval_prompt' =&gt; 'force',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'access_type' =&gt; 'offline'\n\u00a0\u00a0\u00a0\u00a0]\n];\n\u00a0\n$adapter = new HybridauthProviderMicrosoftGraph( $config );<\/code><\/pre>\n<p>Aseg\u00farese de reemplazar todos los marcadores de posici\u00f3n con sus valores reales. Pas\u00e9 los alcances requeridos para nuestro objetivo final, as\u00ed que mant\u00e9ngalo como est\u00e1. Ahora, en <code>callback.php<\/code>cu\u00e1l es mi URL de devoluci\u00f3n de llamada, escribir\u00e9 un c\u00f3digo que inicia el proceso de autenticaci\u00f3n, lo redirecciona despu\u00e9s de una autorizaci\u00f3n exitosa y almacena la informaci\u00f3n de los tokens en la tabla de la base de datos.<\/p>\n<p><strong>callback.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\ntry {\n\u00a0\u00a0\u00a0\u00a0$adapter-&gt;authenticate();\n\u00a0\u00a0\u00a0\u00a0$token = $adapter-&gt;getAccessToken();\n\u00a0\u00a0\u00a0\u00a0$db = new DB();\n\u00a0\u00a0\u00a0\u00a0if($db-&gt;is_table_empty()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$db-&gt;update_access_token(json_encode($token));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo \"Access token inserted successfully.\";\n\u00a0\u00a0\u00a0\u00a0}\n}\ncatch( Exception $e ){\n\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage() ;\n}<\/code><\/pre>\n<p>Ejecute el <code>callback.php<\/code>en el navegador, complete el proceso de autenticaci\u00f3n. Una vez completada la autenticaci\u00f3n, deber\u00eda ver los detalles del token almacenados dentro de la tabla &#8216;tokens&#8217;.<\/p>\n<h3>Agregar tabla en la hoja de OneDrive<\/h3>\n<p>Para agregar los datos a trav\u00e9s de la API de Microsoft Graph, debe insertar una tabla en la hoja de OneDrive. Dir\u00edgete a la p\u00e1gina de OneDrive. Haga clic en el &#8216;libro de trabajo de Excel&#8217; debajo del men\u00fa desplegable &#8216;Nuevo&#8217;.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" alt=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\" ><\/a><\/p>\n<p>Una vez que est\u00e9 en la p\u00e1gina de la hoja, haga clic en el icono &#8216;Tabla&#8217; y luego en &#8216;Aceptar&#8217; en la ventana emergente abierta.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" alt=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\" ><\/a><\/p>\n<p>Despu\u00e9s de esto, ver\u00e1 la Tabla insertada en su hoja de OneDrive de la siguiente manera.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" alt=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\" ><\/a><\/p>\n<p>Ajuste las columnas seg\u00fan sus requisitos. En mi caso, mantuve 3 columnas.<\/p>\n<p>Ahora, uno puede preguntarse por qu\u00e9 es necesario insertar una tabla en la hoja. Cuando estaba investigando este tema, descubr\u00ed que esta es la \u00fanica forma de escribir datos en el libro de Excel. Puede leer m\u00e1s sobre esto en su <a href=\"https:\/\/docs.microsoft.com\/en-us\/graph\/excel-write-to-workbook\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentaci\u00f3n<\/a>.<\/p>\n<p>Tome nota cuando insertemos la tabla por primera vez en la hoja, su valor es &#8216;Table1&#8217;. Necesitamos este valor en el momento de llamar a las API. Si por alguna raz\u00f3n, quita la tabla y la inserta nuevamente, su valor se convierte en &#8216;Table2&#8217; y as\u00ed sucesivamente.<\/p>\n<p>Copie su ID de hoja que se requiere en una llamada API. Puede obtenerlo desde la URL del navegador como se muestra en la captura de pantalla a continuaci\u00f3n.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20341-6081e1b2bab8e.png\" alt=\"Escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP\" ><\/a><\/p>\n<h3>Escribir datos en la hoja de OneDrive con Microsoft Graph API y PHP<\/h3>\n<p>Hasta ahora, hemos terminado con la instalaci\u00f3n de los paquetes necesarios, la inserci\u00f3n de tokens en la base de datos y la creaci\u00f3n de un libro de Excel con una tabla. Ahora, estamos listos para seguir adelante y escribir un c\u00f3digo que agregue datos a la hoja de OneDrive usando la API de Microsoft Graph y PHP.<\/p>\n<p>Estoy creando un archivo <code>append-to-onedrive-sheet.php<\/code>y mi c\u00f3digo ser\u00e1 como se escribe a continuaci\u00f3n.<\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\n\/\/ here you can pass as many data as a separate array element\n$arr_data = [\n\u00a0\u00a0\u00a0\u00a0['John Doe', 'john@test.com', '8888888888']\n];\n\u00a0\nappend_to_sheet($arr_data);\n\u00a0\nfunction append_to_sheet($arr_data = array()) {\n\u00a0\u00a0\u00a0\u00a0$item_id = 'YOUR_SHEET_ID';\n\u00a0\u00a0\u00a0\u00a0$table = 'Table1'; \/\/in your case it can be Table2, Table3, ...\n\u00a0\n\u00a0\u00a0\u00a0\u00a0$db = new DB();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0$arr_token = (array) $db-&gt;get_access_token();\n\u00a0\u00a0\u00a0\u00a0$accessToken = $arr_token['access_token'];\n\u00a0\n\u00a0\u00a0\u00a0\u00a0try {\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$client = new GuzzleHttpClient([\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ Base URI is used with relative requests\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'base_uri' =&gt; 'https:\/\/graph.microsoft.com',\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request(\"POST\", \"\/v1.0\/me\/drive\/items\/$item_id\/workbook\/tables\/$table\/rows\/add\", [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'json' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'values' =&gt; $arr_data\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'headers' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'Authorization' =&gt; 'Bearer '. $accessToken\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'verify' =&gt; false,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\u00a0\u00a0\u00a0} catch(Exception $e) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if( 401 == $e-&gt;getCode()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$refresh_token = $db-&gt;get_refersh_token();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$client = new GuzzleHttpClient(['base_uri' =&gt; 'https:\/\/login.microsoftonline.com']);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request('POST', '\/common\/oauth2\/v2.0\/token', [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'form_params' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"grant_type\" =&gt; \"refresh_token\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"refresh_token\" =&gt; $refresh_token,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"client_id\" =&gt; ONEDRIVE_CLIENT_ID,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"client_secret\" =&gt; ONEDRIVE_CLIENT_SECRET,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\" =&gt; ONEDRIVE_SCOPE,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"redirect_uri\" =&gt; ONEDRIVE_CALLBACK_URL,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$db-&gt;update_access_token($response-&gt;getBody());\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0append_to_sheet($arr_data);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage(); \/\/print the error just in case your video is not uploaded.\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>En el c\u00f3digo anterior, cre\u00e9 una matriz que tiene el elemento de matriz con 3 valores. Puede pasar tantos elementos de matriz. Tienes que pasar tu ID de hoja a la <code>$item_id<\/code>variable.<\/p>\n<p>Este c\u00f3digo obtiene un token de acceso de la base de datos y env\u00eda una solicitud POST al punto final de API requerido. Si el token caduca, lo regenera autom\u00e1ticamente en segundo plano y contin\u00faa el proceso.<\/p>\n<p>Pru\u00e9belo y ver\u00e1 que sus datos se adjuntan al libro de Excel de su cuenta de OneDrive.<\/p>\n<p>Espero que sepas c\u00f3mo escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP. Comparta sus pensamientos y sugerencias en la secci\u00f3n de comentarios a continuaci\u00f3n.<\/p>\n<h4>Art\u00edculos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/conversion-de-voz-a-texto-con-amazon-transcribe-en-php\/\" title=\"Conversi\u00f3n de voz a texto con Amazon Transcribe en PHP\">Conversi\u00f3n de voz a texto con Amazon Transcribe en PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/enviar-correo-electronico-usando-mailjet-alternativa-al-servidor-smtp-de-gmail-en-php\/\" title=\"Enviar correo electr\u00f3nico usando Mailjet en PHP\">Enviar correo electr\u00f3nico usando Mailjet en PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/integracion-de-la-pasarela-de-pago-de-paypal-en-php-mediante-la-api-rest-de-paypal\/\" title=\"Integraci\u00f3n de la pasarela de pago de PayPal en PHP mediante la API REST de PayPal\">Integraci\u00f3n de la pasarela de pago de PayPal en PHP mediante la API REST de PayPal<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo estudiamos c\u00f3mo escribir datos en la hoja de OneDrive usando Microsoft Graph API y PHP. La API de Microsoft Graph sigue el flujo de OAuth para<\/p>\n","protected":false},"author":1,"featured_media":20342,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[203,271],"tags":[849],"class_list":["post-28996","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-elementor-2","category-php-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/28996","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/comments?post=28996"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/28996\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media\/20342"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media?parent=28996"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/categories?post=28996"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/tags?post=28996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}