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

Как получить данные из 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_листа

1
$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);
PHP

Результат

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
	)
)
2

Добавив к 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);
PHP

Результат

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

Получение файла заметно тормозит работу скрипта, а также у 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));
PHP

Чтение price.json

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

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

В полученный массив $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);
PHP
17.02.2019, обновлено 30.09.2020
22815
Следующая запись ZIP в PHP (ZipArchive)

Комментарии 6

Сергей Мобиле Сергей Мобиле
28 декабря 2019 в 17:43
Это работает только, если таблица открыта всем для чтения/записи. А как считать в csv таблицу, открытую только для чтения?
Web-Blog Web-Blog
6 июля 2020 в 17:13
Крутой пример, спасибо большое, помогло, но вот как избавиться от вывода пустых строк в таблице, я имею ввиду строки с пустым значением?
Андрей Ефимов Андрей Ефимов
5 сентября 2020 в 23:56
Спасибо, очень помогло.
Михайло Петях Михайло Петях
2 января 2022 в 01:26
 а также у Google есть лимиты на количество запросов

А какие есть лимиты? По идее, на чтение никаких лимитов не должно быть
Alexey Gnevyshev Alexey Gnevyshev
13 мая 2022 в 08:09
Это ж просто золотая находка!
Вот не знал, что так просто можно взять из Google файлик CSV.
Спасибо Вам большое!
Александр Сарычев Александр Сарычев
17 декабря 2023 в 01:36
Это ламерство. И только для публичных таблиц и обращение к листу по gid, а не по имени.

, чтобы добавить комментарий.

Другие публикации

Массив $_SERVER
Описание значений глобального массива $_SERVER с примерами.
52658
+3
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
18517
+2
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
66092
+33
Запись в лог-файл в PHP
Несколько вариантов как быстро организовать запись данных в лог-файл.
81115
+12
Работа с JSON в PHP
JSON (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и...
114455
+15
Бот Телеграм на PHP
Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
141549
+44