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

30.11.15

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Обработка гугл-таблицы.epf
.epf 11,48Kb
27
27 Скачать (1 SM) Купить за 1 850 руб.

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

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

Все приложения, получающие доступ к 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С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

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

57600 руб.

26.11.2024    1230    1    1    

4

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

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

36000 руб.

03.08.2020    18350    20    22    

18

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

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20557    13    19    

18

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

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

14400 руб.

20.12.2024    317    2    0    

5

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    2445    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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;- пустая. Как исправить?
Оставьте свое сообщение