Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

3. Создайте в выбранном проекте сервисный аккаунт или выберите существующий сервисный аккаунт. При создании нового аккаунта достаточно выполнить шаг 1, редактировать доступы к проектам не обязательно. Сохраните имя и ID сервисного аккаунта (Service account ID) - оно они понадобится позднее.

...

3. У созданного сервисного аккаунта создайте ключ в формате JSON. ВНИМАНИЕ, сразу после создания ключа вам будет предложено сохранить файл - сохраните его в надежном месте. Если вы пропустили сохранение файла - удалите созданный ключ и сделайте новый, сохранив файл.

...

1. Создайте новую таблицу Google Sheets или открываете созданную ранее, проверьте наименование листа, там не должно быть символов на русском языке, при необходимости переименуйте название листа таблицы

2. Добавьте созданный сервисный аккаунт ID созданного ранее сервисного аккаунта в качестве редактора таблицы

...

Подключение интеграции с Google к AutoFAQ

...

  1. Создайте переменные сервиса с названием goggle_account_email и запишите в нее ID созданного ранее сервисного аккаунта

...

  1. Создайте секретную переменную сервиса с названием google_private_key и сохраните в ней значение поля private_key из сохраненного JSON файла с ключом учетной записи. Сценарий будет использовать этот ключ для авторизации и получения токена.

...

  1. Создайте секретную переменную сервиса с названием google_token с пустым значением для хранения временного токена. Сценарий будет использовать эту переменную для временного хранения токена с ограничением по времени жизни.

Пример сценария c сохранением

...

данных в таблице Google Sheets

Ниже приведен пример сценария опроса пользователя и сохранения результатов опроса в таблицу Google Sheets.

Expand
titleРазверните чтобы открыть текст сценария
Code Block
languagepy
//
// Сценарий опроса пользователя и сохранения результатов в таблице Google Sheet 
// 
// УказатьИдентификатор наименованиетаблицы сервисногоGoogle аккаунтаSheet
установитьПеременную("emailsheetId", "autofaqaccount@autofaqproject.iam.gserviceaccount.com1UyTG1ag6kb-tKCD0Wc5nD21zE38TvYSiMMQ_vzwxWbs") +
// Название Указатьлиста идентификаторв таблицытаблице Google Sheet
установитьПеременную("sheetIdsheetName", "18ItMIY6-epFpT1yoYuP2NyE2jRND8V-uxR2XTUd2tC8Sheet1")+
//
// Опрос пользователя
// Указать название листа в таблице Google Sheet 
установитьПеременную("sendFio", "{userFullName}")+
если("{sendFio} == ").то(
    задатьПользователюВопрос("Укажите как вас зовут, пожалуйста").сохранитьРезультат("sendFio")
)+
установитьПеременную("sheetNamesendEmail", "Sheet1{userEmail}")+
//
// Опрос пользователя
если("{sendEmail} == ").то(
    задатьПользователюВопрос("Как вас зовутУкажите адрес вашей электронной почты").сохранитьРезультат("sendFiosendEmail")
)+
задатьПользователюВопрос("КемПожалуйста назовите вываш работаетеотдел").сохранитьРезультат("sendOtdel") +
задатьПользователюВопрос("СколькоПожалуйста назовите вамвашу летдолжность").сохранитьРезультат("sendAgesendDolznost") +
задатьПользователюВопрос("Уточните, пожалуйста, что для Вас является приоритетным?").сВариантамиОтвета("Получение максимальной суммы","Простота получения").сохранитьРезультат("sendPriority")+
задатьПользователюВопрос("Укажите, на какие цели предназначается займ?").сохранитьРезультат("sendGoal")+
//
// Отправка запроса в гугл
// 
// ФормированиеПопытка телаполучения запросасохраненного наранее добавлениетокена 1для строкизапросов в конец таблицы, количество столбцов - не более 25
google из переменных сервиса
получитьПеременнуюСервиса("google_token", "g_token")+
// Разбор сохраненного токена
выполнитьJs("""
try {
    var doc = JSON.parse(g_token);
} catch(e) {
   // Дата добавления
    var sendDate = new Date();
    
    // Список добавляемых значений var doc = {'token': '', 'ts': 0};
}

var token = '';
var now_ts =  parseInt(Date.now() / 1000);

if (now_ts > doc.ts) {
    var error = 1;    
} else if (doc.ts == 0) {
    var addValues error = 2;
} else if (doc.token = [sendDate, userLogin, sendFio, sendOtdel, sendAge, sendPriority, sendGoal];
  = '') {
    var error = 3;
} else {
    var error = //0;
 Расчет необходимого числа колонокvar token = doc.token;
}

var sheetsNamesexit = [{'Aerror':error, 'Btoken':token, 'Cexpired':doc.ts, 'D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','W','X','Y','Z'];
    var sheetEnd = sheetsNames[addValues.length];

    // Формирование тела запроса
    var requestBody = {"range": sheetName+"!A1:"+sheetEnd+"1", "majorDimension": "ROWS", "values":[addValues,]};

    var exit = {'requestBodyJSON':JSON.stringify(requestBody), 'sheetEnd':sheetEndnow_ts':now_ts};
exit;
""") +
комментарий("Получил сохраненный токен, статус токена {error}")+ 
// Проверка актуальности сохраненного токена
если("{error} == 0").то(
    // Токен записан и его время жизни не истекло 
    // Сценарий переходит непосредственно к запросу на добавление данных в таблицу
    комментарий("Токен еще валиден, используем его")+
    перейтиНаМетку("google_query")
)+
// Токен или не сохранен или его время жизни истекло
// Сценарий получает новый токен
комментарий("Токен не валиден, получаем новый токен")+
// Сценарий получает из переменных сервиса секретный ключ и адрес аккаунта гугл 
получитьПеременнуюСервиса("google_private_key", "g_private_key") +
получитьПеременнуюСервиса("goggle_account_email", "goggle_account_email") +
// Проверка полученных данных
если("{g_private_key} == ").то(
    комментарий("Нет приватного ключа от аккаунта, не могу получить токен.")+
    завершить
)+
если("{goggle_account_email} == ").то(
    комментарий("Нет адреса аккаунта гугл, не могу получить токен.")+
    завершить
)+
// Сценарий формирует тело запроса на получение токена 
выполнитьJs("""
var header = {
        "alg": "RS256",
        "typ": "JWT"
    };
var data = {
        "iss": goggle_account_email,
        "scope": "https://www.googleapis.com/auth/spreadsheets",
        "aud": "https://oauth2.googleapis.com/token",
        "exp": parseInt(Date.now() / 1000) + 3600,
        "iat": parseInt(Date.now() / 1000)
    };

var sHeader = JSON.stringify(header);
var sPayload = JSON.stringify(data);
var s_g_private_key = g_private_key.replace(/\\n/g,'');
var signature = KJUR.jws.JWS.sign(header.alg, sHeader, sPayload, s_g_private_key);

var exit = {'signature':signature};
exit;
""") +
// //Сценарий Получениезапрашивает временногогугла токена для работы с гугл таблицей 
получения токена
вызвать.внешнийСервис("https://deniskoauth2.autofaqgoogleapis.aicom/gtokentoken", "GETPOST").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8")).сПараметрами(("email","{email}")).сохранитьРезультат(("message","message"),("token","token"),("status","status"))сТеломСообщения("{'grant_type':'urn:ietf:params:oauth:grant-type:jwt-bearer', 'assertion':'{signature}'}").сохранитьРезультатКакСтроку("result")+
если("{http_code} > 210").то(
    комментарий("Сценарий не смог получить токен для работызаписи св таблицейтаблицу. Код ошибки {http_code}, ответ {result}")+
    сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу смогсвязаться сохранитьс результатыGoogle.")+    
    завершить
)+
// Сценарий разбирает ответ от гугл на получения токена
выполнитьJs("""
try {
    var resultParced = JSON.parse(result)
} catch(e) {
    var resultParced = {'access_token':'','expires_in':0};
}
var token = resultParced.access_token;
var expires = resultParced.expires_in;
var g_token = {'token': token, 'ts': parseInt(Date.now() / 1000) + 3599};

var exit = {'token':token, 'expires':expires, 'g_token':JSON.stringify(g_token)};
exit;
""") +
// Сценарий разбирает ответ гугла
если("{statustoken} == error").то(
    комментарий("Сценарий не смог получитьраспознать токен дляв работыответе сот таблицейгугла. Ответ {messageresult}")+
    сообщениеПользователю.сШаблоном("Спасибо за опросучастие, но что-то сломалось и я не смогмогу связаться сохранитьс результатыGoogle.")+    
    завершить
)+
// Сценарий сохраняет полученный токен для будущего использования
изменитьПеременнуюСервиса("google_token", "{g_token}")
комментарий("Обновил сохраненный токен для запросов в гугл")+
// 
// Отправка данных в гугл таблицу Метка для запроса на запись данных в таблицу
установитьМетку("google_query") +
//
// Формирование тела запроса на добавление 1 строки в конец таблицы, количество столбцов не более 25
выполнитьJs("""
    // Дата добавления
    var sendDate = new Date();
    // Список добавляемых значений
    var addValues = [sendDate, sendEmail, sendFio, sendOtdel, sendDolznost, sendPriority, sendGoal];

    var sheetsNames = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','W','X','Y','Z'];
    var sheetEnd = sheetsNames[addValues.length];
    var requestBody = {"range": sheetName+"!A1:"+sheetEnd+"1", "majorDimension": "ROWS", "values":[addValues,]};

    var exit = {'requestBodyJSON':JSON.stringify(requestBody), 'sheetEnd':sheetEnd};
exit;
""") +
//
// Сценарий отправляет запрос на отправку данных в табличку
вызвать.внешнийСервис("https://sheets.googleapis.com/v4/spreadsheets/{sheetId}/values/{sheetName}!A1:{sheetEnd}1:append","POST").сПараметрами(("valueInputOption","USER_ENTERED")).сЗаголовками(("Authorization", "Bearer {token}"),("Content-Type","application/json")).сТеломСообщения("{requestBodyJSON}").сохранитьРезультатКакСтроку("result")+
// Сценарий разбирает результаты запроса
если("{http_code} > 210").то(
    комментарий("Сценарий не смог отправить запрос на добавление строчки в гугл таблице. Код {http_code}, ответ {result}")+
    сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу связаться с центромGoogle.")+    
    завершить
)+
// ФинальныеЗапрос на отбивкидобавление изаписи завершениезавершен сценарияуспешно
комментарий("Добавил строчку в гугл таблицу.") +
сообщениеПользователю.сШаблоном("Все записал. Большое спасибо за участие!") +
завершить

Подключение к Gmail

  1. Пройдите по ссылке http://console.cloud.google.com/apis/library/gmail.googleapis.com

  2. Выберите ваш проект и включите доступ проекта в Google Sheets API

...