Baca Dan Tulis Google Sheets Dari PHP

Baca Dan Tulis Lembar Google Dari PHP

Minggu terakhir ini saya harus bisa membaca beberapa data dari Google Sheet dan kemudian memperbarui kolom untuk setiap baris setelah memprosesnya. Hal semacam ini seharusnya sederhana, Google dibangun di atas API dan memiliki SDK klien untuk hampir semua bahasa. Saya juga telah terintegrasi dengan beberapa API Google Admin sebelumnya, jadi saya berharap ini akan mudah. Saya salah.

Saya mulai dengan membaca Quickstart for Sheets API dengan PHP Client , tetapi segera saya tahu itu tidak ditulis untuk kasus penggunaan saya. Ini ditulis untuk aplikasi yang ingin mengakses sheet atas nama pengguna akhir dengan antarmuka web dan dapat melakukan tarian OAuth2. Kasus penggunaan saya adalah menggunakan proses backend untuk berfungsi sebagai akun layanan dan data proses batch. Jadi seluruh proses kredensial API salah bagi saya. Saya mencoba segala macam hal dengan membuat akun layanan, memberikannya pendelegasian di seluruh domain, menambahkannya melalui antarmuka Admin Google Apps untuk mengizinkan klien API ke cakupan Lembar, tetapi saya tetap tidak diizinkan untuk membaca spreadsheet.

Akhirnya dari tebakan acak saya berpikir “hmm, kredensial akun layanan yang saya daftarkan di Google Developer Console untuk proyek saya memiliki bidang client_email , saya ingin tahu apakah saya dapat membagikan akses ke spreadsheet dengan alamat email itu”. Benar saja, itu berhasil! Rupanya akun kredensial ini dapat digunakan mirip dengan akun Google normal ketika berbagi akses ke Google Docs/Sheets/dll.

Jadi demi dokumentasi saya sendiri, dengan asumsi saya akan melupakan ini dalam beberapa minggu mendatang, berikut adalah proses menggunakan PHP Google Client untuk membaca/menulis Lembar Google.

  1. Perbarui composer.json untuk meminta “google/apiclient”: “^2.0” dan jalankan pembaruan komposer
  2. Buat proyek aktif https://console.developers.google.com/apis/dashboard .
  3. Klik Aktifkan API dan aktifkan Google Sheets API
  4. Buka Kredensial , lalu klik Buat kredensial , dan pilih Kunci akun layanan
  5. Pilih Akun layanan baru di drop down. Beri nama akun, apa pun boleh.
  6. Untuk Peran saya memilih Proyek -> Aktor Akun Layanan
  7. Untuk Jenis kunci , pilih JSON (default) dan unduh file. File ini berisi kunci pribadi jadi berhati-hatilah dengannya, bagaimanapun juga itu adalah kredensial Anda
  8. Terakhir, edit izin berbagi untuk spreadsheet yang ingin Anda akses dan bagikan baik View (jika Anda hanya ingin membaca file) atau Edit (jika Anda memerlukan akses baca/tulis) ke alamat client_email yang dapat Anda temukan di file JSON.

Itu seharusnya semua pengaturan yang diperlukan untuk mengautentikasi dan mengedit Google Sheet. Di bawah ini adalah beberapa contoh kode untuk cara menggunakannya di PHP.

<?php
require __DIR__ . '/vendor/autoload.php';


/*
 * We need to get a Google_Client object first to handle auth and api calls, etc.
 */
$client = new \Google_Client();
$client->setApplicationName('My PHP App');
$client->setScopes([\Google_Service_Sheets::SPREADSHEETS]);
$client->setAccessType('offline');

/*
 * The JSON auth file can be provided to the Google Client in two ways, one is as a string which is assumed to be the
 * path to the json file. This is a nice way to keep the creds out of the environment.
 *
 * The second option is as an array. For this example I'll pull the JSON from an environment variable, decode it, and
 * pass along.
 */
$jsonAuth = getenv('JSON_AUTH');
$client->setAuthConfig(json_decode($jsonAuth, true));

/*
 * With the Google_Client we can get a Google_Service_Sheets service object to interact with sheets
 */
$sheets = new \Google_Service_Sheets($client);

/*
 * To read data from a sheet we need the spreadsheet ID and the range of data we want to retrieve.
 * Range is defined using A1 notation, see https://developers.google.com/sheets/api/guides/concepts#a1_notation
 */
$data = [];

// The first row contains the column titles, so lets start pulling data from row 2
$currentRow = 2;

// The range of A2:H will get columns A through H and all rows starting from row 2
$spreadsheetId = getenv('SPREADSHEET_ID');
$range = 'A2:H';
$rows = $sheets->spreadsheets_values->get($spreadsheetId, $range, ['majorDimension' => 'ROWS']);
if (isset($rows['values'])) {
    foreach ($rows['values'] as $row) {
        /*
         * If first column is empty, consider it an empty row and skip (this is just for example)
         */
        if (empty($row[0])) {
            break;
        }

        $data[] = [
            'col-a' => $row[0],
            'col-b' => $row[1],
            'col-c' => $row[2],
            'col-d' => $row[3],
            'col-e' => $row[4],
            'col-f' => $row[5],
            'col-g' => $row[6],
            'col-h' => $row[7],
        ];

        /*
         * Now for each row we've seen, lets update the I column with the current date
         */
        $updateRange = 'I'.$currentRow;
        $updateBody = new \Google_Service_Sheets_ValueRange([
            'range' => $updateRange,
            'majorDimension' => 'ROWS',
            'values' => ['values' => date('c')],
        ]);
        $sheets->spreadsheets_values->update(
            $spreadsheetId,
            $updateRange,
            $updateBody,
            ['valueInputOption' => 'USER_ENTERED']
        );

        $currentRow++;
    }
}

print_r($data);
/* Output:
Array
(
    [0] => Array
        (
            [col-a] => 123
            [col-b] => test
            [col-c] => user
            [col-d] => test user
            [col-e] => usertest
            [col-f] => email@domain.com
            [col-g] => yes
            [col-h] => no
        )

    [1] => Array
        (
            [col-a] => 1234
            [col-b] => another
            [col-c] => user
            [col-d] =>
            [col-e] => another
            [col-f] => another@eom.com
            [col-g] => no
            [col-h] => yes
        )

)
 */

 

Output dari contoh itu berasal dari Google Sheet berikut:

 

Yah, mudah-mudahan itu akan menyelamatkan orang lain suatu hari nanti.

Leave a Reply

Your email address will not be published. Required fields are marked *