Загрузка google таблицы

29.05.23

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

Загрузим google таблицу через GET запрос.

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

Наименование Файл Версия Размер
Загрузка google таблицы:
.epf 8,06Kb
9
.epf 1 8,06Kb 9 Скачать

Была поставлена задача загружать в 1С google таблицу и постоянно обновлять ее в 1с (каждые 5 минут).

Таблица примерно такого вида:

 

 

 

 

В ссылке на google таблицу нас интересуют две части.

1 часть - это id самой таблицы

2 часть - это gid листа (если лист номер1, тогда gid=0)

 

 

Делаем запрос из 1С к этому адресу, в конце добавляем /export?format=csv

 

 

АдресРесурса = "docs.google.com";        
АдресНужнойСтраницы = "/spreadsheets/d/"+ТаблицаГугл+ "/export?format=csv&gid=" + ЛистГугл;

Соединение = Новый HTTPСоединение(АдресРесурса,,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(АдресНужнойСтраницы);
Ответ = Соединение.Получить(Запрос);

Этот запрос вернет Ответ.КодСостояния = 307 (HTTP код перенаправления 307 Temporary Redirect означает, что запрошенный ресурс был временно перемещён в URL-адрес, указанный в заголовке Location)

Делаем следующий запрос по адресу из заголовка

 

 

Location = Ответ.Заголовки.Получить("Location");  
Location = СтрЗаменить(Location,"https://","");  
НомЕкс = СтрНайти(Location,"/export/");
АдресРесурса = Лев(Location,НомЕкс-1);  
АдресНужнойСтраницы = Сред(Location,НомЕкс);  

Соединение = Новый HTTPСоединение(АдресРесурса,,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(АдресНужнойСтраницы);	
Ответ = Соединение.Получить(Запрос);
ВходящаяСтрока = Ответ.ПолучитьТелоКакСтроку();

 

Получаем строку в формате csv с разделителем "," Поменять разделитель на ";" не получится. Потому могут возникнуть трудности при разборе строки csv, если в google таблице были использованы запятые.

Написал небольшую обработку, где я получаю данные и парсю их в таблицу значений.

 

 

 

 

Тестировал: 

  • 1С:Комплексная автоматизация 2 (2.4.13.209)
  • Платформа 1С:Предприятие 8.3 (8.3.19.1467)

google таблцы

См. также

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

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

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

36000 руб.

03.08.2020    15748    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    17551    6    15    

13

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

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

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

12000 руб.

02.02.2021    16360    42    49    

23

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

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

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

8400 руб.

01.02.2019    25741    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    88584    160    215    

318
Отзывы
24. xlmel 19.05.23 08:09 Сейчас в теме
(23)
// GET https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values/Sheet1!A1:D5 - это из справки по данному методу.
У меня не получилось подключиться через HTTPСоединение. Пришлось делать через WinHttp.WinHttpRequest.5.1. Я понимаю, что плохо, но работает устойчиво и слава Богу. В итоге функция чтения таблицы приобрела такой вид:

Адрес = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "/values/" + range + "?key=" + API_key;
ХТТПЗапрос = ОбщегоНазначенияHTTP.ПолучитьHTTPЗапрос("GET", Адрес, access_token);
ХТТПЗапрос.Send();
Ответ = ОбщегоНазначенияHTTP.ОбъектJSON(ХТТПЗапрос.ResponseText());
ХТТПЗапрос = Неопределено;
Возврат Ответ;

В сам адрес запроса мне пришлось добавить + "?key=" + API_key. Без этого не взлетало. Прочитал где-то на stackoverflow

Функция ПолучитьHTTPЗапрос(Метод, Адрес, access_token) имеет такой вид:
ХТТПЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.AddObject("ХТТПЗапрос", ХТТПЗапрос);
Скрипт.Eval("ХТТПЗапрос.Option(4)=13056");
ХТТПЗапрос.Open(Метод, Адрес);
ХТТПЗапрос.setRequestHeader("Content-Type", "application/json");
ХТТПЗапрос.setRequestHeader("Accept", "application/json");
ХТТПЗапрос.setRequestHeader("Authorization", "Bearer " + access_token);
Возврат ХТТПЗапрос;

Функция ОбъектJSON(СтрокаJSON) - фактически обертка вокруг этих строк
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
ОбъектJSON = ПрочитатьJSON(Чтение);

API_key - необходимо получить при регистрации приложения на Google
access_token - перед каждым обращением необходимо обменять refresh_token на access_token. refresh_token так же получается при регистрации приложения.
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. PLAstic 295 17.05.23 13:03 Сейчас в теме
Эх, ужас-то какой. Прям расстроил ты меня, Евгений... :(
Ну разве нет апишки для доксов? Для "диска", на худой конец? Ну ведь можно же читать любые файлы через апишку красиво.
Axil; prestige; kser87; +3 Ответить
3. siamagic 17.05.23 15:20 Сейчас в теме
(1)Зачем эта заморочка? Копируешь урл - получаешь результат. Работы на час с чаем.
5. PLAstic 295 17.05.23 16:45 Сейчас в теме
(3) А ещё проще - показывать табличный документ в 1С и просто копипастить в него данные из таблицы. Кажется, даже загрузка данных из табличных документов с диска ИТС взлетит с этим.
7. John_d 5277 17.05.23 16:56 Сейчас в теме
(5) так не пойдет, загружать нужно каждые 5 минут
9. PLAstic 295 17.05.23 17:14 Сейчас в теме
(7) Тогда намного выгоднее использовать г.диск. У меня подобное было для Я.диска реализовано, там потрясающая работа с файлами.
А это решение, как ни крути, фронтэндерский колхоз.
2. xlmel 17.05.23 15:18 Сейчас в теме
GET запрос к https://sheets.googleapis.com/v4/spreadsheets/ + spreadsheetId + /values/ + range, где spreadsheetId - id таблицы, а range имеет вид Sheet1!A1:D5, позволяет получить данные из указанного участка таблицы в json-формате и нет проблем с десятичными разделителями.
prestige; budidich; starik-2005; mrChOP93; Lemmonbri; akR00b; uk09; ixijixi; Aleksey.Bochkov; +9 Ответить
18. mikl79 118 18.05.23 15:30 Сейчас в теме
(2)
GET запрос к https://sheets.googleapis.com/v4/spreadsheets/ + spreadsheetId + /values/ + range, где spreadsheetId - id таблицы, а range имеет вид Sheet1!A1:D5, позволяет получить данные из указанного участка таблицы в json-формате и нет проблем с десятичными разделителями.

а можно пример запроса?
spreadsheetId - вот это больше всего интересует
19. xlmel 18.05.23 16:59 Сейчас в теме
(18) В примере топик-стартера это Таблица гугл.
23. mikl79 118 19.05.23 07:24 Сейчас в теме
(19), у меня не получилось, Ответ.КодСостояния = 403
24. xlmel 19.05.23 08:09 Сейчас в теме
(23)
// GET https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values/Sheet1!A1:D5 - это из справки по данному методу.
У меня не получилось подключиться через HTTPСоединение. Пришлось делать через WinHttp.WinHttpRequest.5.1. Я понимаю, что плохо, но работает устойчиво и слава Богу. В итоге функция чтения таблицы приобрела такой вид:

Адрес = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "/values/" + range + "?key=" + API_key;
ХТТПЗапрос = ОбщегоНазначенияHTTP.ПолучитьHTTPЗапрос("GET", Адрес, access_token);
ХТТПЗапрос.Send();
Ответ = ОбщегоНазначенияHTTP.ОбъектJSON(ХТТПЗапрос.ResponseText());
ХТТПЗапрос = Неопределено;
Возврат Ответ;

В сам адрес запроса мне пришлось добавить + "?key=" + API_key. Без этого не взлетало. Прочитал где-то на stackoverflow

Функция ПолучитьHTTPЗапрос(Метод, Адрес, access_token) имеет такой вид:
ХТТПЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.AddObject("ХТТПЗапрос", ХТТПЗапрос);
Скрипт.Eval("ХТТПЗапрос.Option(4)=13056");
ХТТПЗапрос.Open(Метод, Адрес);
ХТТПЗапрос.setRequestHeader("Content-Type", "application/json");
ХТТПЗапрос.setRequestHeader("Accept", "application/json");
ХТТПЗапрос.setRequestHeader("Authorization", "Bearer " + access_token);
Возврат ХТТПЗапрос;

Функция ОбъектJSON(СтрокаJSON) - фактически обертка вокруг этих строк
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
ОбъектJSON = ПрочитатьJSON(Чтение);

API_key - необходимо получить при регистрации приложения на Google
access_token - перед каждым обращением необходимо обменять refresh_token на access_token. refresh_token так же получается при регистрации приложения.
4. kser87 2438 17.05.23 16:30 Сейчас в теме
Интересно, банит ли гугл за большое количество подобных запросов?
За обращение к геокодеру банит, например.
6. John_d 5277 17.05.23 16:51 Сейчас в теме
(4) может если слишком много, обращаюсь каждые 5 минут (не банит)
user965942; +1 Ответить
29. user1740389 23.05.23 11:37 Сейчас в теме
(4)
Немного не в тему, но у меня есть arduinки, которые мониторят показатели микроклимата в различных помещениях. Информация залетает в гугл таблицу на разные листы.
Каждое устройство посылает сигнал примерно раз в минуту (ардуино и точное время - тема для отдельного разговора).
Бана нет. Пока работает 3 устройства
8. Antoska 17 17.05.23 17:12 Сейчас в теме
Любопытно. А таблица доступна по ссылке или есть авторизация?
10. SpaceOfMyHead 188 17.05.23 20:57 Сейчас в теме
Сообщило "не получен. Статус-код 302"

Редиректит на аутентификацию
11. laperuz 46 18.05.23 09:39 Сейчас в теме
А не проще было поле HTML документа на форму вынести и подключить обработчик ожидания, который бы каждые 5 минут вызывал обновление?
14. Antoska 17 18.05.23 09:48 Сейчас в теме
(11) Смотря что нужно с данными сделать. Если просто показать, то можно было бы поле использовать. А вот если куда записать надо или обработать данные, то тут уже лучше в CSV.
12. SpaceOfMyHead 188 18.05.23 09:46 Сейчас в теме
У меня обработка не заработала. Гугл возвращает 302. Обрабатываешь 302 - отдаёт HTML аутентификации
13. SpaceOfMyHead 188 18.05.23 09:47 Сейчас в теме
(12) Получилось. Надо предоставить доступ к документу всем, у кого есть ссылка

Не нашёл этого нюанса в статье. Хорошо бы это упомянуть
15. Antoska 17 18.05.23 09:49 Сейчас в теме
(13) Вот и ответ на мой вопрос. Нужен доступ по ссылке.
16. John_d 5277 18.05.23 11:22 Сейчас в теме
17. mikl79 118 18.05.23 14:56 Сейчас в теме
Спасибо, интересно, попробовал - тоже получилось.
20. xlmel 18.05.23 18:05 Сейчас в теме
Касательно бана за запросы, когда писал для себя библиотеку работы с Google Sheets, то упирался в 100 запросов за 5 минут. Если нужно больше, то надо как-то настраивать в аккаунте. Если честно, я не разобрался. Для чтения этого с головой хватает. Труднее, если нужно формировать таблицу с нуля со всем форматированием. Ввиду того, что пакеты были очень большими и довольно трудно было все это поддерживать, то каждую операцию форматирования делал отдельным запросом. В итоге обычно 2 запроса на создание таблицы и предоставление прав и в зависимости от сложности несколько запросов на форматирование каждого листа. Я делал отдельно ширину колонок, высоту строк, заливку + шрифт + числовой формат + перенос, объединение ячеек, границы ячеек и условное оформление. Мне так было проще, но это все можно собрать в один запрос. Если лист в таблице 1, то уже 3 запроса. 4-й запрос - загрузка данных на лист. Каждый следующий лист - еще обычно 2 запроса, хотя можно объединить форматирование всех листов в один запрос. Таким образом ограничение не является критичным.
Есть еще один способ, я в последнее время для вывода в шаблоны и загрузки использую его. Я на Google Apps Script написал небольшое и достаточно простое приложение с функциями doGet() и doPost(). Первая возвращает данные из таблицы, id которой передан как параметр, а вторая создает или изменяет таблицу по данным из параметров запроса. В таком виде кроме данных можно получить массу дополнительной информации, например дату и время последнего изменения. И что было для меня более важно, в рамках одного скрипта можно работать со всем их зоопарком: GMail, Disk, Sheets, Docs, Calendar, Translator, Forms. И вроде как один вызов скрипта - один запрос к Google. Опубликовал скрипт как веб-приложение, получил его адрес и теперь в регламентах опрашиваю нужные документы и собираю информацию или выгружаю информацию. Поэтому, я бы советовал интеграцию с Google делать через Apps Script.
31. kser87 2438 26.05.23 11:09 Сейчас в теме
(20) надо у гугла покупать платный доступ. Они выдают ключ и его в теле каждого запроса надо указывать. Стоит прямо скажем недешево
21. starik-2005 3033 18.05.23 19:08 Сейчас в теме
У меня один знакомый бесполезник халтурил деланием сайтов, так всю СУБД хранил в таком вот гугелшите. Надо ему другой сайт - просто гуглошит копировал и менял там все на то, что надо. Отличный инструмент! Админки (особенно битрикса) нервно курят в углах и льют крокодильные слезки...
22. starik-2005 3033 18.05.23 19:12 Сейчас в теме
Статье + стоит поставить только лишь за то, что она единственная в списке рекомендуемых настоящая статья, а не реклама непойми чего )))
ЗЫ :Зря ты, автор, файл к статье прифигачил. Получишь за 50 звезд не 20 $M, а 0.
26. John_d 5277 19.05.23 10:57 Сейчас в теме
(22) я не ожидал, что она так быстро наберет 50 звезд) Бывает статья набирает 20-30 звезд и так остается висеть. Спасибо всем, кто поддержал.
maksa2005; +1 Ответить
27. Antoska 17 19.05.23 15:35 Сейчас в теме
(26)Хорошая статья. Почему бы и не сохранить в избранном?
32. kser87 2438 26.05.23 11:12 Сейчас в теме
(26) удалите файл. вам начислят СМ. Проверено
25. xlmel 19.05.23 08:25 Сейчас в теме
Я вроде про создание приложений для обработки таблиц Google Sheets писал.
28. SpaceOfMyHead 188 22.05.23 08:53 Сейчас в теме
Кстати. С помощью HTTP-клиента можно так:

Адрес = "https://docs.google.com/spreadsheets/d/2Gq80KtQgMdAd-ma_3OsUASS6ItDsRsT8DpY4BXcKKcs/export?format=csv&gid=0";
ДП = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();

Ответ = КлиентHTTPКлиентСервер
	.ИспользоватьСессию(ДП)
	.ТелоОтветаКакТекст(ДП)
	.Получить(Адрес, , ДП);

ВашЦСВ = Ответ.Тело;
Показать
30. пользователь 25.05.23 02:17
Сообщение было скрыто модератором.
...
Оставьте свое сообщение