Как получить данные из 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
добавить дату и при каждом чтении файла ее проверять. Как только пройдут сутки, данные в файле обновить.
$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);
А какие есть лимиты? По идее, на чтение никаких лимитов не должно быть
Вот не знал, что так просто можно взять из Google файлик CSV.
Спасибо Вам большое!