1

Тема: VBS + Google Docs

Добрый день.

Мне требуется скрипт, который бы подключался к Google Docs (Spreadsheet) и:
1) Создавал там лист с названием месяца, если такого листа ещё нет
2) Заполнял определённую ячейку данными

Я нашёл статью http://danila.org.ua/vyigruzka-tablichn … oogle-tab/, но к сожалению она не полная и там есть ошибки в коде, хотя на видео под статьёй делается ровно то, что мне нужно.
По этой статье у меня получилось только авторизоваться, т.е. получить Маркер.

Кто-нибудь занимался подобным или, например, знает, где можно почитать?
Google API я пытался смотреть, но не нашёл ничего, что могло бы помочь. Не исключаю, что не так смотрел.

Заранее спасибо.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

2

Re: VBS + Google Docs

А в чём сложность ? На чём остановились ? Дошёл до второго этапа - Получение списка листов. Дальше по аналогии вроде бы просто.


Option Explicit

Dim oHttpRequest
Set oHttpRequest = CreateObject("MSXML2.XMLHTTP")

Main()

Sub Main()
    Dim SID, LSID, Auth
    
    ClientLogin "user@gmail.com", "pass", "wise", SID, LSID, Auth
    
    GetSpreadSheetsList Auth
    
    MsgBox "Data saved to C:\DATA.xml"
End Sub

Sub ClientLogin(ByVal Email, ByVal Passwd, ByVal service, ByRef SID, ByRef LSID, 

ByRef Auth)
    Dim aTextLines
    Dim sTextLine
    Dim aParams
    Dim sValue
    With oHttpRequest
        .open "POST", "https://www.google.com/accounts/ClientLogin", False
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .send "Email=" & Email & "&Passwd=" & Passwd & "&service=" & service & 

"&source=Gulp-CalGulp-1.05"
        if .status <> 200 Then Err.Raise vbObjectError + 1, "ClientLogin", "Server 

response status " & .status & " " & .statusText 
        aTextLines = Split(.responseText,vbLf)
    End With
    For Each sTextLine in aTextLines
        aParams = Split(sTextLine,"=",2)
        If Ubound(aParams) = 1 Then
            sValue = Trim(aParams(1))
            Select Case Trim(aParams(0))
            Case "SID"
                SID = sValue
            Case "LSID"
                LSID = sValue
            Case "Auth"
                Auth = sValue
            End Select
        End if
    Next
End Sub

Sub GetSpreadSheetsList(ByVal Auth)
    Dim oXmlParser
    Set oXmlParser = CreateObject("MSXML2.DOMDocument")
    With oHttpRequest
        .open 

"GET","https://spreadsheets.google.com/feeds/spreadsheets/private/full", False
        .setRequestHeader "Content-Type","application/atom+xml"
        .setRequestHeader "Authorization", "GoogleLogin auth=" & Auth
        .send
        oXmlParser.Load .responseBody
    End With
    oXmlParser.save "C:\DATA.xml"
End Sub
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: VBS + Google Docs

Xameleon пишет:

А в чём сложность ? На чём остановились ? Дошёл до второго этапа - Получение списка листов. Дальше по аналогии вроде бы просто.

Спасибо, взял из кода несколько удачных примеров.
Только дальше не совсем по аналогии.
На сколько я понимаю, это получен не список "листов", а список "книг".
А вот как получить лист из книги и (что-то мне подсказывает, что это ИДЛиста из примера), как его создать при необходимости и какую строку сформировать для записи значения - вот в чём вопрос.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

4

Re: VBS + Google Docs

MikeSh, думаю есть 3 пути.
1) Связаться с автором примера http://danila.org.ua/about/
2) Самому заняться исследованием запросов, которые отправляет сервис docs.google.com. Для удобства можно использовать мониторинг запросов встроенный во все современные браузеры.
3) Почитать документацию https://developers.google.com/google-apps/spreadsheets/

P.S По последней ссылке, где примеры кода на NET, рекомендую нажать справа наверху вкладку Protocol, тогда можно увидеть отправляемые POST данные и примеры ответа сервера.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5

Re: VBS + Google Docs

Пойду по первому пути, он наиболее быстрый.
Или тупик или результат.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

6

Re: VBS + Google Docs

Google API в Вашем случае на мой взгляд перебор. Достаточно несколько строчек Google Apps Script с использованием Spreadsheet Service.
Пример:
- создаем скрипт, пишем код функции doGet - имя функции важно:


function doGet(e) {  
  if (!e.parameters.name) return; //  в запросе отсутствует параметр name
  var sheetId = '1aqFA8ylaZpgqBBObXSxQNUDPBXIzCzbFy3FYs8mXE_o', // id вашей таблицы
      ss = SpreadsheetApp.openById(sheetId); // таблица
  if (ss.getSheetByName(e.parameters.name)) return;// лист с таким именем существует
  // создаем лист и в ячейку A1 вставляем 'Hello!'
  ss.insertSheet(e.parameters.name).getRange(1, 1).setValue('Hello!');
}

- разворачиваем в качестве веб-приложения, после чего отправляем в адрес развернутого скрипта запросы из чего Вам удобнее - WSH, powershell и т.п.
Если тема Google Apps Script заинтересовала - у меня на блоге есть несколько полезных постов по теме. Удачи.

7

Re: VBS + Google Docs

dab00 пишет:

Достаточно несколько строчек Google Apps Script с использованием Spreadsheet Service.

Как и следовало ожидать, просто не получилось.
1) Как создать скрипт? Инструменты - Редактор скриптов?
2) Как нужно передавать запросы?
3) Как использовать авторизацию или отключить её использование?

Спасибо.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

8

Re: VBS + Google Docs

1) можно Инструменты - Редактор скриптов - тогда скрипт будет "встроен" в таблицу, можно создать отдельно: Диск - Создать - Скрипт, если в первый раз - нужно подключить: Диск - Создать - Подключить другие приложения - в поисковой строке пишем Google Apps Script

2) не понял вопрос, выше ссылку давал - посмотрите - там несколько несложных примеров запросов есть

3) для того, чтобы развернуть скрипт в качестве веб-приложения, в редакторе скриптов:
- Файл - Версии - Сохранить новую версию
- Публикация - Развернуть как веб-приложение - Кто имеет доступ к приложению - Все, включая анонимных пользователей
Таким образом скрипт видят все, для авторизации отправляем в запросе какой нибудь параметр типа password, в скрипте проверяем, если валидация не прокатила - досвидос. Это самый простой вариант.

Можно авторизоваться с помощью OAuth 2.0: получать токен авторизации на клиенте, к примеру с помощью Javascript Client Library, отправлять его в запросе, а на сервере (в скрипте) валидировать токен отправляя запрос в адрес соответствующего API, но это больше подойдет для браузерных приложений.

Можно сделать: Кто имеет доступ к приложению - Только я, в таком случае прежде чем отправлять запрос нужно авторизоваться с помощью аккаунта Google.
На VBS я такую авторизацию не делал, приходилось на powershell, если интересно могу показать код.
Но по моему опыту первого варианта в большинстве случаев достаточно, с авторизацией с помощью аккаунта Google - 
если домен Google, клинические политики безопасности и пр.

Пожалуйста.

9

Re: VBS + Google Docs

Право слово, даже не удобно.
Я не считаю себя ни глупым, ни ленивым, но вот не могу разобраться и всё тут.
Вы можете продемонстрировать, как это должно работать?

https://docs.google.com/spreadsheets/d/ … sp=sharing - пустая таблица, отшаренная на полную.

Спасибо.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

10 (изменено: dab00, 2014-06-05 20:49:49)

Re: VBS + Google Docs

Код в Вашу таблицу положил. Дальше:
- Открываем таблицу - Инструменты - Редактор скриптов
- Нажимаем кнопку "Выполнить" (необходимо сделать один раз для авторизации) - Требуется авотризация - Продолжить - Принять - Не обращаем внимания на ошибку
- Файл - Версии - Сохранить новую версию - ОК
- Публикация - Развернуть как веб-приложение - Кто имеет доступ к приложению - Все, включая анонимных пользователей - Развернуть
- Копируем Текущий URL веб-приложения - Вставляем в адресную строку браузера, добавляем параметр: ?name=june
Получится типа: https://script.google.com/macros/s/AKfycbx6_Cnq8KN4eh3PFMNLxJExasVKyFkNJ6wab6xHjhIxWVUFAgk/exec?name=june

Код:


function doGet(e) {  
  if (!e.parameters.name) { //  в запросе отсутствует параметр name
    return ContentService.createTextOutput(JSON.stringify({result: 'wrong params'})).setMimeType(ContentService.MimeType.JSON);
  }
  var sheetId = '1GtWcQorfBtpa0AZRUkAHdlj2OD0XJLlAJeiyDOSc1RQ', // id вашей таблицы
      ss = SpreadsheetApp.openById(sheetId); // таблица
  
  if (ss.getSheetByName(e.parameters.name)) { // лист с таким именем существует
    return ContentService.createTextOutput(JSON.stringify({result: 'sheet exists'})).setMimeType(ContentService.MimeType.JSON);
  }
  
  // создаем лист и в ячейку A1 вставляем 'Hello!'
  ss.insertSheet(String(e.parameters.name)).getRange(1, 1).setValue('Hello!');
  return ContentService.createTextOutput(JSON.stringify({result: 'ok'})).setMimeType(ContentService.MimeType.JSON);
}

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

11

Re: VBS + Google Docs

dab00, спасибо.
Добрался я таки до гугледоков.

dab00, подскажи, пожалуйста, как развить тему.
Мне нужно передавать несколько параметров, что-то будет строкой, что-то числом (с запятой)

В данный момент скрипт выглядит так

function doGet(e) {  
  if (!e.parameters.name) { //  в запросе отсутствует параметр name
    return ContentService.createTextOutput(JSON.stringify({result: 'wrong params Name'})).setMimeType(ContentService.MimeType.JSON);
  }
  if (!e.parameters.param2) { //  в запросе отсутствует параметр shop
    return ContentService.createTextOutput(JSON.stringify({result: 'wrong params Param2'})).setMimeType(ContentService.MimeType.JSON);
  }
  
  var 
    sheetId = '1P9-G166-YHL7w0Sw0hyF0oXGtvnPpiMzFHmTYtt81-w', // id вашей таблицы
    Var1 = String(e.parameters.param2),
    ss = SpreadsheetApp.openById(sheetId); // таблица
  
  if (ss.getSheetByName(e.parameters.name)) { // лист с таким именем существует
    return ContentService.createTextOutput(JSON.stringify({result: 'sheet exists'})).setMimeType(ContentService.MimeType.JSON);
  }
  
  // создаем лист и в ячейку A1 вставляем 'Hello!'
  ss.insertSheet(String(e.parameters.name)).getRange(1, Var1).setValue('Hello!');
  return ContentService.createTextOutput(JSON.stringify({result: 'ok'})).setMimeType(ContentService.MimeType.JSON);
}

и не работает
Я пробовал
https://script.google.com/macros/s/AKfycby1_ZAvRNxS3qkiAqyvW1d-So_5TDlpecM9pXJXkkP3eqbIwzZl/exec?name=2?param2=3
и так
https://script.google.com/macros/s/AKfycby1_ZAvRNxS3qkiAqyvW1d-So_5TDlpecM9pXJXkkP3eqbIwzZl/exec?name=2,param2=3

Ругается на отсутствие параметра.
Если проверку закомментировать, то создаётся лист "2?Param2=3" и "2,Param2=3"
В общем, нужно где-то раздобыть внятный мануал, поиски по https://developers.google.com/ не привели ни к чему, вероятно из-за того, что сам не знаю, что искать.
А ведь ещё нужно с преобразованием типов разбираться и вообще с синтаксисом...

Буду благодарен за любую помощь.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.