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

27.05.24

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

Загрузим google таблицу в таблицу значений с использованием API google.

Для получения данных по API нужно получить ключ

 
Получение API key

Переходим в консоль google для получения API

console.cloud.google.com

Выбираем "Select a project" 

Нажимаем NEW PROJECT

Заполняем нажимаем create

Переходим в APIs

Жмем enable APIs

в поиске вбиваем sheets жмем интер. Жмем google sheets API

Жмем enable

Слева жмем Credentials

Жмем create Credentials, выбираем API key

Будет создан Api. жмем его

выбираем restrict key, выпадающем списке ищем sheets. Жмем save

API key готов

Для примера я создал таблицу

 

 

В ссылке на таблицу наc интересует id таблицы

 

 

Теперь делаем Get-запрос к сервису google

 

 

Функция ПолучитьДанныеИзГуглТаблицы(ИдТаблицы,НазваниеЛиста,КлючАПИ) 
	
	АдресРесурса = "sheets.googleapis.com";        
	АдресНужнойСтраницы = "/v4/spreadsheets/"+ИдТаблицы+"/values/"+НазваниеЛиста+"?key="+КлючАПИ;
	
	Соединение = Новый HTTPСоединение(АдресРесурса,,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	Запрос = Новый HTTPЗапрос(АдресНужнойСтраницы);
	Ответ = Соединение.Получить(Запрос);
	
	Если Ответ.КодСостояния = 200 Тогда	 	
		ВходящаяСтрока = Ответ.ПолучитьТелоКакСтроку(); 
		Возврат ВходящаяСтрока;
	Иначе
	    Сообщение = Новый СообщениеПользователю;
	    Сообщение.Текст = "не получен. Статус-код " + Ответ.КодСостояния;
	    Сообщение.Сообщить();
	    Возврат "";
	КонецЕсли;
	
КонецФункции

СтрокаJSON = ПолучитьДанныеИзГуглТаблицы("12345678912334567","Лист1","AIz1111111111111111111111Q");

 

Получаем строку json

 

 

{
  "range": "'Лист1'!A1:Z1000",
  "majorDimension": "ROWS",
  "values": [
    [
      "Товар",
      "Кол-во",
      "цена",
      "Годность"
    ],
    [
      "груши",
      "12",
      "14,55",
      "18.12.2023"
    ],
    [
      "яблоки",
      "123",
      "15,74",
      "21.12.2023"
    ],
    [
      "сливы",
      "41",
      "17,32",
      "25.12.2023"
    ]
  ]
}

 

Преобразуем строку JSON в Таблицу значений

 

 

СтрокаJSON = ПолучитьДанныеИзГуглТаблицы("12345678912334567","Лист1","AIz1111111111111111111111Q");
Если ЗначениеЗаполнено(СтрокаJSON) Тогда
	МассивСтрок = ИзJSON(СтрокаJSON).values;  
	ТЗ = ПолучитьТЗ(МассивСтрок);  
КонецЕсли;

Функция ИзJSON(СтрокаJSON) Экспорт
	ТекТоварыJSON = Новый ЧтениеJSON ;
	ТекТоварыJSON.УстановитьСтроку(СтрокаJSON);
	Возврат ПрочитатьJSON(ТекТоварыJSON);
КонецФункции

Функция ПолучитьТЗ(МассивСтрок)  
	
	ТЗ = Новый ТаблицаЗначений;	      
	ТЗ.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(50)));
	ТЗ.Колонки.Добавить("Количетсво", Новый ОписаниеТипов("Число", ,Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный)));     
	ТЗ.Колонки.Добавить("Цена",	Новый ОписаниеТипов("Число", ,Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Неотрицательный)));
	ТЗ.Колонки.Добавить("Годность",	Новый ОписаниеТипов("Дата"));        
	
	Первая = Истина;
	Для Каждого Стр из МассивСтрок Цикл     
		Если Первая Или Стр[0]="" Тогда  
			Первая = Ложь;
			Продолжить;	
		КонецЕсли;	
		НовСтр = ТЗ.Добавить();
		НовСтр.Товар = Стр[0];    
		НовСтр.Количетсво = Стр[1];
		НовСтр.Цена = Стр[2];     
		НовСтр.Годность = Стр[3]+" 00:00:00";
	КонецЦикла;
	
	Возврат ТЗ;
КонецФункции

 

В результате получаем Таблицу значений

 

 

Тестировал: 

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

google sheets таблицы api key

См. также

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

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

36000 руб.

03.08.2020    17887    19    22    

17

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

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

7200 руб.

04.05.2021    20017    13    17    

17

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

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

22656 руб.

25.05.2021    14492    42    8    

18

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

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

24000 руб.

27.09.2024    1524    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ClickUp 725 26.12.23 12:49 Сейчас в теме
2. Antoska 16 26.12.23 15:58 Сейчас в теме
3. John_d 5893 26.12.23 16:32 Сейчас в теме
(2) можно обращаться к google таблицам без api получая в ответ csv с разделителем запятая.
У этого способа есть минусы, если в таблице есть запятые, то колонки сбиваются
5. Antoska 16 26.12.23 17:35 Сейчас в теме
(3) Понятно. Там через файл обмен. Забыл. Увидел практически то же название у новой публикации, что и у старой, потому среагировал.
4. akor77 198 26.12.23 17:17 Сейчас в теме
А вы можете в таблицах Google сделать синхронизацию со списком документов в 1С?
Есть книга с листами, один лист - один календарный месяц.
При создании нового документа, или после изменения, данный документ отражается новой строкой на соответствующем месяцу листе.
При изменении документа или пометке удаления и т.п. отразить данные изменения на листе.
На листе Google таблицы сделать изменения (подобие флага, единички) и по изменении оповестить 1С и сделать отметку в самом документе.
Слабо?
6. John_d 5893 26.12.23 18:07 Сейчас в теме
(4) Да, это интересно. Возможно сделаю это в следующей статье.
7. akor77 198 26.12.23 18:45 Сейчас в теме
(6) Я перечитал свой комментарий, хочу уточнить, что требуется изначально создавать документы в 1С, например, реализации товаров.
После сохранения/изменения документа в 1С данные о нём необходимо записать/обновить на листе таблицы Google.
Кроме того, задача осложнена тем, что на данных листах имеются пользовательские формулы в колонках правее от загружаемых на страницу данных, их нельзя затереть, они создаются пользователем. Такие листы делаются из одного шаблона, там примерно заготовлено X строк с формулами.
Кладовщики, собрав заказ и загрузив в машину на доставку, делают в определенной колонке таблицы пометку которая из листа должна попасть обратно в документ 1С, например, проставить флаг "отгружено".
При этом, добавлять новые записи на листе таблицы Google надо новой строкой, а изменять в имеющейся строке (в которую была сделана изначальная запись после создания документа) т.к. на других листах будут формулы, которые будут привязаны к физическому номеру строки.
12. ixijixi 1922 27.12.23 09:51 Сейчас в теме
(7) Любопытно у вас бизнес-процессы организованы... А АРМ кладовщика в 1С не проще сделать?
13. akor77 198 27.12.23 10:30 Сейчас в теме
(12) Вообще можно, но ... )))) мы поняли друг-друга )
14. akor77 198 27.12.23 14:34 Сейчас в теме
(12) ещё добавлю, пользователям необходим функционал Google-таблиц. они создают свои таблицы на новых листах с формулами, где подбирают заказы по "временным воротам", автомобилям и т.д.
Они могут на ходу поменять формулы, структуру таблиц и т.д. - полная свобода действий для творчества без оков!
8. John_d 5893 26.12.23 21:58 Сейчас в теме
(7) Прочитать изменения, которые происходят в таблице google очень просто можно воспользоваться функцией ПолучитьДанныеИзГуглТаблицы (из статьи).
Вызывать ее регламентным заданием каждую минуту.
В 1с создать регистр сведений с такими же колонками как в гугл таблице.
Сравнивать в запросе этот регистр с Таблицей значений, которую получаем функцией ПолучитьТЗ (из статьи). Даже если там будет 10000 строк мы найдем именно те в которых были изменения.
Записать эти записи в регистр сведений и если нужно в документ.
9. akor77 198 26.12.23 23:13 Сейчас в теме
(8)Спасибо! Значит, надо будет постоянно выгружать весь диапазон ячеек Google-таблицы и делать запрос к базе данных 1С для поиска отличий. Думаю, этот вариант тяжеловат, но, я так понимаю, другого варианта Вы не видите?
10. John_d 5893 26.12.23 23:25 Сейчас в теме
(9) Такой вариант у меня работает в продакшен. Мне кажется других вариантов тут нет.
Но остается еще записать изменения из 1с в google таблицу.
15. aleksey2 89 27.12.23 15:29 Сейчас в теме
(10) зачем тянуть все строки, когда можно только там где единички. когда мы меняем строку в столбец А пишем 1.
16. John_d 5893 27.12.23 17:56 Сейчас в теме
(15) в итоге больше проблем будет.
Забрать все равно придется все и делать фильтр уже в 1с, а потом еще нужно убрать 1 из google из обработанных строк.
11. akor77 198 27.12.23 00:23 Сейчас в теме
17. xlmel 28.12.23 10:15 Сейчас в теме
Вы можете написать скрипт на Google Apps Script, в котором провести все необходимые манипуляции с данными и затем вернуть уже отфильтрованные строки. Этот скрипт публикуете как web-приложение. Если Вы можете работать через API c Google Sheets, то не будет никаких проблем с запуском скрипта. В итоге получите только те строки, в которых 1, и при этом, по факту того, что обмен выполнен, сразу сможете убрать 1, чтобы при следующем обмене не тянуть эти строки повторно. А если нет строк с 1, то нет необходимости тянуть весь массив данных.
Дмитрий74Чел; +1 Ответить
18. akor77 198 22.01.24 19:29 Сейчас в теме
(17)Я решил данную задачу. Но мне хотелось узнать, есть ли кто уже выполнил данную реализацию. Пока реализаций я не встречал. То, что имеется в на просторах интернет меня не устраивало. В итоге я реализовал свой механизм регистрации изменённых данных и отправки только изменённых данных из 1С в Google-Таблицу и обратное получение только изменённых данных. Рабочая база имела очень высокую нагрузку и закачивать в 1С всю Google-Таблицу и сравнивать запросом - это недопустимая роскошь.
19. xlmel 23.01.24 08:58 Сейчас в теме
(18) Реализацию чего? Скрипта, который считает таблицу? Я не эксперт в GAS, может плохо сделал, у меня выглядит так:

function doGet(e) {
const templateDocId = e.parameter.templateDocId;
const sheetName = e.parameter.sheetName;
if(templateDocId == NaN || String(templateDocId) == "") {
return createResponse(400, "Bad templateDocId");
}

return createResponse(200, getDocumentStructure(templateDocId, sheetName));
}

function getDocumentStructure(docId, sheetName) {
var ss = SpreadsheetApp.openById(docId);
response = [];

var sheet = ss.getSheetByName(sheetName);
response.push({
index: 0,
sheetName: sheet.getName(),
values: sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues()
});

return response;
}

function createResponse(status = 400, data = "", id = "", responseType = "HTTP") {
response = {
status: status,
data: data,
docId: id
};

const stringResponse = JSON.stringify(response);

return ContentService.createTextOutput(stringResponse).setMimeType(ContentService.MimeType.JSON);
}

Первая функция - метод для обработки GET-запроса. ID таблицы и имя листа передается в параметрах запроса.
Вторая - получает данные с листа. Третья - возвращает их. Я считываю все данные, но можно и сделать проверку.
20. akor77 198 23.01.24 11:55 Сейчас в теме
(19) В моей реализации я делал POST-запрос из 1С, там сразу велись передача и приём одним запросом, потом на стороне 1С контроль что всё отправленное записалось таблицу, полученное отразилось в документах.
21. hrom 69 27.05.24 06:04 Сейчас в теме
Данный способ через Api key начинает работать только если дать доступ "ВСЕМ у кого есть ссылка". А есть ли способ работать с гугл таблицей из 1С, если к гугл таблице есть доступ ограниченному количеству учеток?
22. John_d 5893 27.05.24 09:29 Сейчас в теме
23. hrom 69 27.05.24 12:05 Сейчас в теме
(22) спасибо

Нашел статью как сделать типовыми средствами

https://infostart.ru/1c/articles/2088582/
24. hrom 69 27.05.24 14:15 Сейчас в теме
А зачем вы после того как получили Ответ.КодСостояния = 200 снова отправляете тот же самый запрос?
Прикрепленные файлы:
25. John_d 5893 27.05.24 14:31 Сейчас в теме
(24) Спасибо за внимательность. Исправил. Переделывал механизм из этой моей статьи (https://infostart.ru/1c/tools/1854690/), где сначала получаю код 307 и делаю запрос уже по нужному адресу.
26. user1374747 235 20.06.24 16:39 Сейчас в теме
Вот ведь как приятно. Сегодня первый раз подошел к гугловским таблицам. Раньше как то не приходилось сталкиваться на практике. Нашел статью и через полчаса задача была сделана. Чудо как толково и понятно. И код готовый приведен. Слегка причесал под себя и готово.
Однозначный плюс и респект.
mark_oilbass; John_d; +2 Ответить
27. user1768822 14.11.24 21:25 Сейчас в теме
Попробовал, работает, спасибо
Оставьте свое сообщение