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

30.11.15

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

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Обработка гугл-таблицы.epf
.epf 11,48Kb
27 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

Все приложения, получающие доступ к 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 доступ к гугл таблице гугл таблица

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    22204    32    24    

26

SALE! 15%

WEB-интеграция Программист Бизнес-аналитик 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17280 14688 руб.

20.12.2024    4384    22    4    

23

WEB-интеграция Программист Руководитель проекта 1С:Предприятие 8 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки. Основные преимущества: 1. Документация API создаётся автоматически. Удобна для программной обработки. 2. Изменить API столь же просто как настроить отчёт. Можно опубликовать существующий вариант отчёта. 3. Отчёты в API поддерживают параметры (Период, ДатаНачала и др.) 4. При создании простых методов не требуется изменять конфигурацию. 5. Поддерживается работа с планами обмена.<br/> 6. Возможно настроить отправку из 1С данных корреспондирующей системе, для случаев когда 1С сама "знает" какие данные нужно отправить. 7. После записи в 1С Ле Мурр может возвращать соответствие полученных идентификаторов созданным в 1С объектам данных.

36000 руб.

27.09.2024    10154    7    5    

11

WEB-интеграция Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

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

12000 руб.

02.02.2021    20959    60    52    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kao_andi 21 01.12.15 07:18 Сейчас в теме
Вопрос, а почему HTTP-запросы реализованы через COM-объект, чем не устроили типовые?
dimzfresh; +1 Ответить
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 484 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;- пустая. Как исправить?
Для отправки сообщения требуется регистрация/авторизация