gifts2017

Выгрузка таблиц (Excel, OpenOffice) в Google Drive

Опубликовал Анатолий Златов (zan_od) в раздел Обмен - Загрузка и выгрузка в Excel

Обработка позволяет загрузить файлы Excel и OpenOffice на Google Drive (Google Docs). Не требует дополнительных компонент. Может применяться для публикации документов из 1С (например, обновляемые финансовые отчеты для руководителей).

Обработка работает через Google Apps API, используя напрямую http протокол. Загруженный файл автоматически конвертируется в таблицу (SpreadSheet).

В архиве две обработки - для 1С 7.7 и 8.2. Для работы нужны стандартные компоненты Windows - "WinHttp.WinHttpRequest.5.1", "ADODB.Stream", "Msxml2.DOMDocument" и "MSScriptControl.ScriptControl" (для 1С 7.7).

Работать с обработкой очень просто. Нужно заполнить реквизиты (см. рисунок):

1. Указать имя файла

2. Указать имя аккаунта на @gmail (полностью)

3а. Если в профиле Google включена двухэтапная аутентификация, то нужно сгенерировать имя и пароль приложения здесь и указать их.

3б. Если аутентификация обычная, то просто ввести пароль к аккаунту.

4. Указать имя документа на Google Drive. Если документ с таким именем существует, то его содержимое будет обновлено, иначе будет создан новый.


Все замечания, предложения и найденные ошибки прошу озвучивать в комментариях.


P.S. Для файлов Excel 97 Google Drive не поддерживает конвертацию - при загрузке обработка выдаст ошибку.

UPD 2015-08-03. Переделал обработку под новое API Google Drive.

Основные изменения:

1. Авторизация OAuth2. Внимание! Для возможности использования обработки в автоматическом режиме нужно один раз авторизироваться интерактивно (кнопка "Авторизироваться" на форме обработки). Обработка запоминает токен авторизации (refresh_token) для последующего использования.

2. Изменены процедуры поиска и загрузки документов на Google Drive (JSON).

UPD 2015-08-05. Исправлена ошибка - если имя таблицы содержало одинарные или двойные кавычки, то выдавалась "Parsing Error".


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

Наименование Файл Версия Размер
ВыгрузкаТаблицыExcelВGoogleDrive1.2.epf 42
.epf 19,95Kb
05.08.15
42
.epf 1.2 19,95Kb Скачать
ВыгрузкаТаблицыExcelВGoogleDrive1.2.ert 10
.ert 16,00Kb
05.08.15
10
.ert 1.2 16,00Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр (zato1c) 14.11.12 12:17
Пользуюсь Dropbox уже давно при синхронизации баз. С работы и дома.Если (мысль) поставить по более этих сервисов как где то видел обработку по выборе удаленок. Т.е яндексДиск,Dropbox и т.д но а так +
2. Анатолий Златов (zan_od) 19.11.12 12:19
(1) zato1c,
Я эти обработки писал с другой целью. Клиенту необходима была онлайн-версия отчета из 1С (периодически обновляемая), которую он смог бы расшарить сотрудникам, не работающим в 1С непосредственно. После перебора возможных вариантов остановились на Google Docs.

Не совсем понимаю, зачем использовать 1С для синхронизации файлов в облачных хранилищах. Можно подробнее развить мысль насчет 1С<->Dropbox, например?
адуырщдв; +1 Ответить
3. Александр (zato1c) 19.11.12 16:24
В крцее могу сказать как я делаю. выгружаю конфу в Dropbox после этого прихожу в другое место уже с другого компа открываю свою базу уже с обновленного файла Dropbox.
4. Wanderer.nk 15.03.13 13:14
для этой цели есть VPN.
Abadonna; +1 Ответить
5. Лена (924) 11.08.14 19:51
Добрый день! Пришлите мне пожалуйста обработку на почту vodoroslia@gmail.com , у меня не хватает $ =)
6. Дмитрий Нездоймин (hombre) 03.07.15 07:28
После двух недель нормальной работы, обработка перестала загружать файл на диск. Останавливалась с ошибкой
Ошибка запроса авторизации: Not Found
Ошибка авторизации: пустой wise токен авторизации

Через некоторое время зарабатала, но опять ненадолго. Пароли, Настройки доступа не менялись. Проверял на разных эккаунтах. С чем это может быть связано? Или что можете посоветовать, чтобы исправить ситуацию.
7. Анатолий Златов (zan_od) 03.07.15 12:57
В очередной раз поменялось Google API. У меня тоже перестало выгружаться где-то неделю назад.
Разберусь - выложу обновление.
8. Дмитрий Нездоймин (hombre) 07.07.15 10:46
(7) zan_od, подскажите как часто происходят такие изменения?
9. Анатолий Златов (zan_od) 08.07.15 09:53
(8) hombre, сложно сказать. Google постоянно меняют API, просто изменения могут не затрагивать используемый в обработке функционал. Судя по моим доработкам, функционал выгрузки меняется в среднем раз в год.
10. Дмитрий Нездоймин (hombre) 04.08.15 12:23
Анатолий, спасибо за обновление. При попытке выгрузить файл выходит ошибка
{
"error": {
"errors": [
{
"domain": "global",
"reason": "parseError",
"message": "Parse Error"
}
],
"code": 400,
"message"

Подскажите, в чем может быть проблема?
11. Анатолий Златов (zan_od) 04.08.15 22:44
(10) hombre, для того, чтобы я мог воспроизвести ошибку, приведите полный текст ошибки (судя по приведенному Вами отрывку - это не весь текст).
Имя модуля и номер строки не выводится?
Как выглядит ошибка: диалог посередине экрана или в окне сообщений внизу экрана?
Какой файл загружаете: Excel или OpenOffice?
В какой версии сохранен файл?
Это обновление существующего файла или загрузка нового?
На каком этапе возникает ошибка: авторизация или непосредственно загрузка?
12. Анатолий Златов (zan_od) 04.08.15 22:53
(10) hombre, как называется имя таблицы в Google Drive? Попробуйте выгрузить с простым именем, например "test"
13. Дмитрий Нездоймин (hombre) 05.08.15 10:52
(11) zan_od, Ошибка возникает только при обновлении существующего файла.
В окне сообщения ошибка:
Ошибка запроса обновления документа: (400) Bad Request
Отдельным текстовым окном:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "parseError",
"message": "Parse Error"
}
],
"code": 400,
"message": "Parse Error"
}
}

Имя таблицы на киррилице и на латиннице -результат одинаков.
14. Анатолий Златов (zan_od) 05.08.15 23:38
(13) hombre, имя таблицы содержит кавычки? Исправил. Причина в том, что одинарные кавычки - спецсимвол в URL, а двойные кавычки - спецсимвол в JSON.
15. Дмитрий Нездоймин (hombre) 06.08.15 14:31
(14) zan_od, Без кавычек имя таблицы test
16. Анатолий Златов (zan_od) 06.08.15 18:01
(15) hombre, странно. Давайте проверим такую версию: попробуйте выгрузить другой файл (попробуйте с пустого).
17. Константин Мельников (xlmel) 20.08.15 16:08
Если просто положить файл на один определенный диск в Google Drive, то можно установить GoogleDrive для ПК на компьютер, сохранять файл в папку, на которую настроена синхронизация и не нужно все остальное. Для разных дисков нужно хранить разные refresh_token в разных файлах и где-то сохранять таблицу соответствия, чтобы не проводить при каждом соединении авторизацию. Да и с Google API часто проблемы бывают. В свое время убил кучу времени на Calendar.
18. kras_71 (kras_71) 22.10.15 22:38
В функции ОбновитьДокумент вот такие переделки и все работает:

Функция ОбновитьДокумент(Соединение, ТокенАвторизации, ИмяФайла, ИмяТаблицы, ИдДокумента)
	КоличествоБайт = РазмерФайла(ИмяФайла);
	
	Если ПустаяСтрока(ИдДокумента) = 1 Тогда
		
		Тело = 
		"{
		|	""title"": """ + ЭкранироватьСимвол(ИмяТаблицы, """") + """,
		|	""fileExtension"": ""xls""
		|}";
		
		Соединение.Open("POST", "https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable&convert=true", 0); 
		Соединение.SetRequestHeader("Content-Length", СтрДлина(Тело));
		Соединение.SetRequestHeader("Content-Type", "application/json; charset=UTF-8");
	Иначе  
		 Сообщить("ОБНОВЛЯЕМ");
		Соединение.Open("PUT", "https://www.googleapis.com/upload/drive/v2/files/" + ИдДокумента + "?uploadType=resumable", 0);
		Тело = "";
	КонецЕсли;



  
	Соединение.SetRequestHeader("Authorization", "Bearer "+ТокенАвторизации);
	Соединение.SetRequestHeader("Content-Type", "application/json; charset=UTF-8");
	Соединение.SetRequestHeader("X-Upload-Content-Type", "image/jpeg");
	Соединение.SetRequestHeader("X-Upload-Content-Length", КоличествоБайт);
	//Соединение.SetRequestHeader("Authorization", "Bearer "+ТокенАвторизации);
	//Соединение.SetRequestHeader("X-Upload-Content-Type", "application/vnd.ms-excel");
	//Соединение.SetRequestHeader("X-Upload-Content-Length", КоличествоБайт);
	
	Соединение.Send(Тело); 
	
	Если Соединение.Status <>  200 Тогда
		Сообщить("Ошибка запроса обновления документа: (" + Соединение.Status + ") " + Соединение.StatusText, "!!");
		ВывестиСтроку(Соединение.ResponseText());
		Возврат 0;
	КонецЕсли;
	
	Ссылка = Соединение.GetResponseHeader("Location");
	
	Если ЗагрузитьФайлПоСсылке(Соединение, ТокенАвторизации, Ссылка, ИмяФайла, 0) <> 1 Тогда
		Сообщить("Ошибка загрузки файла на сайт", "!!");
		Возврат 0;
	КонецЕсли;
	
	Возврат 1;
КонецФункции
...Показать Скрыть
19. kras_71 (kras_71) 23.10.15 00:06
20. Анатолий Златов (zan_od) 23.10.15 16:15
(19) kras_71, что пишет? Какая ошибка?
21. Olja Scibarovska (serviceonec) 10.12.15 17:08
За обработку спасибо. Все работает. Хотелось еще бы выгрузку в определенную папку.
22. Alex (Deryni) 05.04.16 18:18
Возникла проблема. Если загружать новый файл - то он загружается, а если попытаться обновить тот, что уже есть (даже тот, который только что загрузил), то выдаёт такую ошибку:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "parseError",
"message": "Parse Error"
}
],
"code": 400,
"message": "Parse Error"
}
}
23. Alex (Deryni) 07.04.16 12:00
Указанную проблему удалось решить так:
Вот этот блок
Соединение.SetRequestHeader("Content-Length", СтрДлина(Тело));
Соединение.SetRequestHeader("Content-Type", "application/json; charset=UTF-8");
Вставляем как для новых файлов, так и для обновляемых и всё работает.
В результате процедуры выглядит так:

Функция ОбновитьДокумент(Соединение, ТокенАвторизации, ИмяФайла, ИмяТаблицы, ИдДокумента) Экспорт
	КоличествоБайт = РазмерФайла(ИмяФайла);
	
	Если ПустаяСтрока(ИдДокумента) Тогда
		
		Тело = 
		"{
		|	""title"": """ + ЭкранироватьСимвол(ИмяТаблицы, """") + """,
		|	""fileExtension"": ""xls""
		|}";
		
		Соединение.Open("POST", "https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable&convert=true", 0); 
	Иначе
		Соединение.Open("PUT", "https://www.googleapis.com/upload/drive/v2/files/" + ИдДокумента + "?uploadType=resumable&convert=true", 0);
		Тело = "";
	КонецЕсли;
	
	Соединение.SetRequestHeader("Content-Length", СтрДлина(Тело));
	Соединение.SetRequestHeader("Content-Type", "application/json; charset=UTF-8");	
	Соединение.SetRequestHeader("Authorization", "Bearer "+ТокенАвторизации);
	Соединение.SetRequestHeader("X-Upload-Content-Type", "application/vnd.ms-excel");
	Соединение.SetRequestHeader("X-Upload-Content-Length", КоличествоБайт);
...Показать Скрыть


Кроме того было обнаружено, что MSScriptControl.ScriptControl не работает на 64-битном сервере 1С.
Поэтому кодирование строки в URI было выполнено раскомментированием соотв. процедуры в модуле, которая делает это без внешних компонент.
Функция для преобразования имени в URI выглядит так:

Функция URLEncode(Знач Строка="")
	Строка = ЭкранироватьСимвол(Строка, "'");
	//ScrCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
	//ScrCtrl.Language = "JScript";
	//Сообщение = ScrCtrl.eval("var uri='"+Строка+"'; encodeURI(uri);");
	Сообщение = URLEncode0(Строка);
	Сообщение = ЭкранироватьСимвол(Сообщение, "'");
	Возврат Сообщение;
КонецФункции
...Показать Скрыть
24. Анатолий Златов (zan_od) 07.04.16 17:35
25. script Мальчинко (script) 17.10.16 13:56
(23) Deryni,

После изменений в процедуре
URLEncode(Знач Строка="")

на 32 разрядном сервере 1С, файл не обновляется, а создается новый.
Если вернуть текст процедуры изначальный - все работает на УРА.

Спасибо огромное за технологию.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа