Получение доступа к скачиванию гугл-таблицы

30.11.15

Интеграция - WEB-интеграция

Стояла задача считать данные с гугл-таблицы и загрузить эти данные в 1С. В этой статье описан механизм получения доступа к скачиванию нужной гугл-таблицы во временный файл .xlsx. Решил поделиться опытом работы. Может, кому-то немного сократит время поиска решения.

Скачать файлы

Наименование Файл Версия Размер
Обработка гугл-таблицы.epf
.epf 11,48Kb
27
.epf 11,48Kb 27 Скачать

В общем, когда начинал гуглить, ничего толком не находил. Статьи в основном старые, а так как недавно гугл изменил способ авторизации, то грош теперь таким статьям цена. Решил копать глубже. Наткнулся на несколько интересных ссылок и разобрался.

Немного теории:

Все приложения, получающие доступ к GoogleAPI, должны быть зарегистрированы разработчиком через API-консоль. Для этого необходимо авторизоваться под учетной записью. Для авторизации нужно использовать протокол OAuth 2.0. Другие протоколы авторизации не поддерживаются гуглом.
Все запросы к Google Analytics API должны быть разрешены пользователем, прошедшим аутентификацию.

В общих чертах процедура аутентификации выглядит так:

  1. Создавая приложение, вы регистрируете его в Google Developers Console. (https://console.developers.google.com)
  2. Вы включаете Drive API в Google Developers Console
  3. Когда приложению потребуются пользовательские данные, оно запрашивает у Google определенную область доступа.
  4. Google показывает пользователю диалоговое окно с предложением авторизовать приложение для запроса этих данных.
  5. Если пользователь соглашается, Google предоставляет приложению токен доступа с коротким сроком действия.
  6. Приложение запрашивает пользовательские данные, указывая токен доступа.
  7. Получив действительный запрос и токен, Google возвращает необходимые данные.

Перейдем к практике.

Скачивать будем эту тестовую гугл таблицу:

https://docs.google.com/spreadsheets/d/1QvjMLjBK3HJrJbcuY16Ihwve2B-AgHdEMpiu9SKrkMQ/edit#gid=0&vpid=A1

Сначала включим  Drive API в Google Developers Console

Переходим по ссылке https://console.developers.google.com, и создаем новый проект

После этого выбираем в списке сервис Drive API (к нему необходимо получить доступ приложению)

Далее переходим по ссылке Credentials, чтобы создать идентификаторы приложения

Задаем имя приложения, которое будет видно пользователю при запросе разрешений.

Затем создаем ID пользователя, еще раз нажав на поле Credentials. 

 

После завершения получаем

Подготовительные действия завершены. Все дальнейшие действия будут выполняться в среде 1С:Предприятие.

Создаем обработку и добавляем на форму элемент ПолеHTMLДокумента. 

 

В процедуре-обработчике события для кнопки “Авторизация” надо написать код, формирующий адрес страницы авторизации и в последней строке открывающий эту страницу на экране для пользователя.

Процедура КнопкаВыполнитьНажатие(Кнопка)
	ПолучитьОсновыеЗначениеПеремменных();
	ПройтиАвторизацию();	
КонецПроцедуры
Процедура ПолучитьОсновыеЗначениеПеремменных()
	redirect_uri = "http://localhost";
	client_id = "158908578317-u84j5fap070ib8o5jtuvgei0m6d6gsv8.apps.googleusercontent.com";
	client_secret = "w-x-FHvuwtjd7yDygCYi4vqB";
	ID_Файл	= "1QvjMLjBK3HJrJbcuY16Ihwve2B-AgHdEMpiu9SKrkMQ";		
КонецПроцедуры
Процедура ПройтиАвторизацию()
	Параметры = "response_type=code"+"&";
	Параметры = Параметры + "client_id="+ client_id + "&";
	Параметры = Параметры + "redirect_uri=" + redirect_uri + "&";
	Параметры = Параметры + "scope=https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive https://spreadsheets.google.com/feeds";
	АдресАвторизации = "https://accounts.google.com/o/oauth2/auth" + "?";
	ПолныйАдресАвторизации = АдресАвторизации + Параметры;
	ЭлементыФормы.Браузер.Перейти(ПолныйАдресАвторизации);
КонецПроцедуры

Таким образом, при нажатии кнопки «Авторизация» пользователю будет выведена страница для выполнения авторизации и выдачи разрешения для доступа к данным таблицы.

Разрешаем доступ приложению. 

Итак, перейдем к скачиванию таблицы. В обработчике действия кнопки "Скачать таблицу" пишем:

Процедура ОсновныеДействияФормыСкачатьТаблицу(Кнопка)
	
	//код доступа берем с заголовка браузера
	//код доступа нужен чтоб получить маркер
	//пишут что код доступа доступен 8 часов. не проверял
	ПолучитьКодДоступа();	
	
	//маркер доступен 1час
	Маркер = ПолучаемМаркер();
	
	Если Найти(Маркер, "Code was already redeemed") = 0 Тогда
		ПолучитьМетаданные();	
	Иначе	
	
	КонецЕсли;
	
	ВременнаяТаблица = ПолучитьИмяВременногоФайла(".xlsx");
	КопироватьФайл(СсылкаДляСкачивания, ВременнаяТаблица);
	
	#Если Клиент Тогда
		Сообщить("Таблица сохранена во временный файл: " + ВременнаяТаблица);
	#КонецЕсли	
	
КонецПроцедуры

Разберем эту процедуру. Сначала нам нужно получить код доступа из заголовка браузера.

Процедура ПолучитьКодДоступа()
	СтрокаСКодом = ЭлементыФормы.Браузер.документ.URLUnencoded;
	Если СтрокаСКодом = "about:blank" Тогда
		#Если Клиент Тогда
			Сообщить("Пройдите авторизацию для получения кода доступа!");	
		#КонецЕсли
		КодДоступа = Неопределено;
	Иначе
		НачалоКода = Найти(ЭлементыФормы.Браузер.документ.URLUnencoded, "=")+1;	
		КодДоступа = Сред(СтрокаСКодом,НачалоКода,СтрДлина(СтрокаСКодом)-1);
	КонецЕсли;
КонецПроцедуры

Далее получаем маркер доступа:

Функция ПолучаемМаркер()
	
	XTTPЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
	Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
	Скрипт.language = "javascript";
	Скрипт.AddObject("XTTPЗапрос", XTTPЗапрос);
	Скрипт.Eval("XTTPЗапрос.Option(4)=13056");
	
	XTTPЗапрос.Open("Post", "https://accounts.google.com/o/oauth2/token", 0);
	XTTPЗапрос.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	
	ПараметрыPOST = "grant_type=authorization_code" + "&";
	ПараметрыPOST = ПараметрыPOST + "code=" + КодДоступа + "&";
	
	ПараметрыPOST = ПараметрыPOST + "client_id=" + client_id + "&";
	ПараметрыPOST = ПараметрыPOST + "client_secret=" + client_secret + "&";
	ПараметрыPOST = ПараметрыPOST + "redirect_uri=" + redirect_uri;
	
	XTTPЗапрос.send(ПараметрыPOST);
		
	ТекстОтвета = XTTPЗапрос.responsetext();
	
	//парсим строку. вытаскиваем значение маркера
	НачалоТокена = Найти(ТекстОтвета, "access_token")+17;
	КонецТокена  = Найти(ТекстОтвета, "token_type")-6;
	пМаркер = Сред(ТекстОтвета,НачалоТокена, КонецТокена-НачалоТокена);
	
Возврат пМаркер;
КонецФункции

Получив маркер, можем получить доступ к метаданным нашей таблицы. В метаданных есть много чего интересного, в том числе и ссылка на скачивание (в форматах csv, pdf, xlsx). Итак, получим метаданные нашей таблицы.

Процедура ПолучитьМетаданные()
	ФайлМетаданных = ПолучитьИмяВременногоФайла(".txt");
		XTTPЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
	Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
	Скрипт.language = "javascript";
	Скрипт.AddObject("XTTPЗапрос", XTTPЗапрос);
	Скрипт.Eval("XTTPЗапрос.Option(4)=13056");
	
	XTTPЗапрос.Open("GET", "https://www.googleapis.com/drive/v2/files/"+ID_Файл);
	XTTPЗапрос.setRequestHeader("Authorization", "Bearer " + Маркер);
	XTTPЗапрос.send();
		ТекстОтвета = XTTPЗапрос.responsetext();
		СсылкаДляСкачивания = ПолучитьСсылкуДляСкачивания(ТекстОтвета);
КонецПроцедуры

Далее дело за малым. Нужно обработать полученный ответ. Вытягиваем от туда ссылку на скачивание. (В нашем примере в формате .xlsx).

Функция ПолучитьСсылкуДляСкачивания(ТекстОтвета)
	
	СтрокаПоиска = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"": """;
	НачалоСсылки = Найти(ТекстОтвета, СтрокаПоиска)+СтрДлина(СтрокаПоиска);	
	КонецСсылки  = Найти(ТекстОтвета, "userPermission")-8;
	Результат = Сред(ТекстОтвета, НачалоСсылки, КонецСсылки-НачалоСсылки);
	
	Возврат Результат;
	
КонецФункции // ()

И финалочка. Скачиваем таблицу во временный файл
Пример кода:       

ВременнаяТаблица = ПолучитьИмяВременногоФайла(".xlsx");
КопироватьФайл(СсылкаДляСкачивания, ВременнаяТаблица);
#Если Клиент Тогда
Сообщить("Таблица сохранена во временный файл: " + ВременнаяТаблица);
#КонецЕсли	

В результате получим временную .xlsx таблицу

spreadsheet гугл гугл-таблицы загрузка работа с гугл google google spreadsheet доступ к гугл таблице гугл таблица

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15729    10    17    

11

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17545    6    15    

13

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16357    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25736    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88576    160    215    

318
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kao_andi 20 01.12.15 07:18 Сейчас в теме
Вопрос, а почему HTTP-запросы реализованы через COM-объект, чем не устроили типовые?
2. softgarant 62 06.12.15 21:10 Сейчас в теме
(1) kao_andi, чесно говоря не пробовал использовать типовые http-запросы. нашел пример реализации через COM, по этому выбор чисто субъективный
3. kashafeev 17.03.16 11:34 Сейчас в теме
А как добавлять данные, в уже имеющуюся Гугл-таблицу (Например для обновления цен). И как сделать это в авто режиме, чтобы не проходить каждый раз авторизацию?
4. viktor2008 16.02.17 08:43 Сейчас в теме
Все прекрасно работает. Файл получил, исправил. А теперь самое главное - как отправить обратно его на гугл-диск?
5. Mirared 10.09.17 14:37 Сейчас в теме
(4) присоединюсь к вопросу. Как обратно сконвертировать Excel в таблицу Google? Подскажите, пожалуйста
6. kyzma-kyzmi4 24 27.04.18 16:48 Сейчас в теме
Добрый день!

Не срабатывает копирование Файла
КопироватьФайл(СсылкаДляСкачивания, ВременнаяТаблица);

Подскажите, на текущий момент код рабочий или Google изменил API?
8. Serj1C 483 20.03.19 12:52 Сейчас в теме
(6) Копирование файла сломалось после массового перехода с HTTP на HTTPS
По умолчанию копирование ломится без шифрования, сервер его редиректит на защищенный протокол и тут получается казус.
softgarant; +1 Ответить
7. softgarant 62 04.05.18 17:12 Сейчас в теме
Скорее всего дело в сервисе Google, проект мы разработали и продали, поддержку не осуществляем, потому как оно сейчас работает не могу знать, к сожалению.
9. kravetz7777 04.12.21 23:57 Сейчас в теме
Добрый день! При получении кода доступа строка ЭлементыФормы.Браузер.документ.URLUnencoded;- пустая. Как исправить?
Оставьте свое сообщение