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

29.05.23

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Загрузка google таблицы:
.epf 8,06Kb ver:1
13
13 Скачать (1 SM) Купить за 1 850 руб.

Была поставлена задача загружать в 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 таблцы

См. также

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

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

36000 руб.

03.08.2020    17780    19    22    

16

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

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

5040 руб.

04.05.2021    19844    13    17    

16

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    14421    42    8    

18

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

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

24000 руб.

27.09.2024    1168    1    0    

3
Отзывы
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 296 17.05.23 13:03 Сейчас в теме
Эх, ужас-то какой. Прям расстроил ты меня, Евгений... :(
Ну разве нет апишки для доксов? Для "диска", на худой конец? Ну ведь можно же читать любые файлы через апишку красиво.
Axil; prestige; kser87; +3 Ответить
3. siamagic 17.05.23 15:20 Сейчас в теме
(1)Зачем эта заморочка? Копируешь урл - получаешь результат. Работы на час с чаем.
5. PLAstic 296 17.05.23 16:45 Сейчас в теме
(3) А ещё проще - показывать табличный документ в 1С и просто копипастить в него данные из таблицы. Кажется, даже загрузка данных из табличных документов с диска ИТС взлетит с этим.
7. John_d 5891 17.05.23 16:56 Сейчас в теме
(5) так не пойдет, загружать нужно каждые 5 минут
9. PLAstic 296 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 119 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 119 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 2470 17.05.23 16:30 Сейчас в теме
Интересно, банит ли гугл за большое количество подобных запросов?
За обращение к геокодеру банит, например.
6. John_d 5891 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 196 17.05.23 20:57 Сейчас в теме
Сообщило "не получен. Статус-код 302"

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

Не нашёл этого нюанса в статье. Хорошо бы это упомянуть
15. Antoska 17 18.05.23 09:49 Сейчас в теме
(13) Вот и ответ на мой вопрос. Нужен доступ по ссылке.
16. John_d 5891 18.05.23 11:22 Сейчас в теме
17. mikl79 119 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 2470 26.05.23 11:09 Сейчас в теме
(20) надо у гугла покупать платный доступ. Они выдают ключ и его в теле каждого запроса надо указывать. Стоит прямо скажем недешево
21. starik-2005 3087 18.05.23 19:08 Сейчас в теме
У меня один знакомый бесполезник халтурил деланием сайтов, так всю СУБД хранил в таком вот гугелшите. Надо ему другой сайт - просто гуглошит копировал и менял там все на то, что надо. Отличный инструмент! Админки (особенно битрикса) нервно курят в углах и льют крокодильные слезки...
22. starik-2005 3087 18.05.23 19:12 Сейчас в теме
Статье + стоит поставить только лишь за то, что она единственная в списке рекомендуемых настоящая статья, а не реклама непойми чего )))
ЗЫ :Зря ты, автор, файл к статье прифигачил. Получишь за 50 звезд не 20 $M, а 0.
26. John_d 5891 19.05.23 10:57 Сейчас в теме
(22) я не ожидал, что она так быстро наберет 50 звезд) Бывает статья набирает 20-30 звезд и так остается висеть. Спасибо всем, кто поддержал.
maksa2005; +1 Ответить
27. Antoska 17 19.05.23 15:35 Сейчас в теме
(26)Хорошая статья. Почему бы и не сохранить в избранном?
32. kser87 2470 26.05.23 11:12 Сейчас в теме
(26) удалите файл. вам начислят СМ. Проверено
unknown181538; +1 Ответить
25. xlmel 19.05.23 08:25 Сейчас в теме
Я вроде про создание приложений для обработки таблиц Google Sheets писал.
28. SpaceOfMyHead 196 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
Сообщение было скрыто модератором.
...
33. SnakePlisskin 3 12.11.24 11:24 Сейчас в теме
Доброго дня!
1. А можно узнать как-то сколько страниц содержит гугл документ ?
2. И как узнать идентификаторы всех этих страниц ?
Оставьте свое сообщение