Справочники, инструменты, документация

PHP: Чтение Google таблиц

Как получить данные из Google spreadsheets в виде массива PHP? Очень просто, Google docs позволяет экспортировать лист в формате CSV, главное чтобы файл был в общем доступе.

Рассмотрим на примере файла: https://docs.google.com/spreadsheets/d/1p7-V7oUWI5iBA7K8a_RVeR4xpptwYP6oN-7Eg-W90aA/edit#gid=0

В URL видим:

1p7-V7oUWI5iBA7K8a_RVeR4xpptwYP6oN-7Eg-W90aA – id документа,

gid=0 – id листа (у первого всегда 0).

Далее нужно сформировать ссылку для получения CSV файла:

https://docs.google.com/spreadsheets/d/id_документа/export?format=csv&gid=id_листа

А дальше остается его только прочитать.

Т.к. формат CSV накладывает свои ограничения – изображения, комментарии, URL ссылок и форматирование текста будут недоступны. Если это требуется, то можно получить XLSX файл и прочитать его с помощью PHPExcel.

https://docs.google.com/spreadsheets/d/id_документа/export?gid=id_листа

Чтение всего листа

$id = '1p7-V7oUWI5iBA7K8a_RVeR4xpptwYP6oN-7Eg-W90aA';
$gid = '0';

$csv = file_get_contents('https://docs.google.com/spreadsheets/d/' . $id . '/export?format=csv&gid=' . $gid);
$csv = explode("\r\n", $csv);
$array = array_map('str_getcsv', $csv);

print_r($array);

Результат:

Array(
    [0] => Array(
        [0] => 20.02.2019
        [1] => 
        [2] => 
        [3] => 
    )
    [1] => Array(
        [0] => Бренд
        [1] => Bosch
        [2] => Ariston
        [3] => Electrolux
    )
    [2] => Array(
        [0] => Мощность, кВ
        [1] => 11.2
        [2] => 14
        [3] => 12.5
    )
    [3] => Array(
        [0] => Объем
        [1] => 10
        [2] => 15
        [3] => 11
    )
    [4] => Array(
        [0] => Цена
        [1] => 11200
        [2] => 15000
        [3] => 12600
    )
)

Получение данных из ячейки или диапазона

Добавив к URL атрибут &range=, можно получить диапазон ячеек.

Ячейка Значение
Одна ячейка A1
Диапазон ячеек B4:D5
Колонка B:B
Строка 3:3
$id = '1p7-V7oUWI5iBA7K8a_RVeR4xpptwYP6oN-7Eg-W90aA';
$gid = '0';
$range = 'B4:D5';

$csv = file_get_contents('https://docs.google.com/spreadsheets/d/' . $id . '/export?format=csv&gid=' . $gid . '&range=' . $range);
$csv = explode("\r\n", $csv);
$array = array_map('str_getcsv', $csv);

print_r($array);

Результат:

Array(
    [0] => Array(
        [0] => 10
        [1] => 15
        [2] => 11
    )
    [1] => Array(
        [0] => 11200
        [1] => 15000
        [2] => 12600
    )
)

Кэширование

Получение файла заметно тормозит работу скрипта, а также у Google есть лимиты на количество запросов. Поэтому полученный массив лучше скидывать в файл JSON и периодически его обновлять.

Первый вариант – обновлять файл по cron

Скрипт который запускается по cron:

<?php
$id = '1p7-V7oUWI5iBA7K8a_RVeR4xpptwYP6oN-7Eg-W90aA';
$gid = '0';
$csv = file_get_contents('https://docs.google.com/spreadsheets/d/' . $id . '/export?format=csv&gid=' . $gid);
$csv = explode("\r\n", $csv);
$array = array_map('str_getcsv', $csv);

file_put_contents(__DIR__ . '/price.json', json_encode($array));

Чтение price.json:

$array = json_decode(file_get_contents(__DIR__ . '/price.json'), true);
print_r($array);

Второй вариант – проверка даты

В полученный массив $array добавить дату и при каждом чтении файла ее проверять. Как только пройдут сутки, данные в файле обновить.

$file = __DIR__ . '/price.json';
$array = json_decode(@file_get_contents($file), true);

if ((@$array['date'] + 86400) < time()) {   
    $id = '1p7-V7oUWI5iBA7K8a_RVeR4xpptwYP6oN-7Eg-W90aA';
    $gid = '0';

    $csv = file_get_contents('https://docs.google.com/spreadsheets/d/' . $id . '/export?format=csv&gid=' . $gid);
    $csv = explode("\r\n", $csv);
    $array = array_map('str_getcsv', $csv);

    $array['date'] = time();
    file_put_contents($file, json_encode($array));
}

print_r($array);