Попытка отправить данные из электронной таблицы Google на внешний API

Я использую Google SpreadSheet и IFTTT для ведения журнала вызовов БД моего телефона, это работает отлично. Теперь я пытаюсь заполнить форму на веб-странице с помощью API из журнала вызовов БД. Я хотел бы отправлять lastRow в свой API каждый раз, когда IFTTT заполняет лист. Первая строка на листе заполняется заголовками: название отдела, имя, фамилия, адрес электронной почты, телефон, крайний срок.

Итак, мне удалось отправить данные в API следующим образом:

function myFunction() {

var data = {

    'department':     1,
    'first_name' :    'Test',
    'last_name' :     'test',
    'email' :         '[email protected]',
    'phone' :         ["0700000000"],
    'deadline' :      '2017-04-10T00:00'
}

var payload = JSON.stringify(data)  

var headers = {

     'AUTHORIZATION': 'Token b8473654v6345teryrby456yrtyrtyertytdvfh87afc',
     // Add any other required parameters for XXX API.
};
var url = 'http://api.XXX.com/api/1.0/clients/';
var options = {
    'method': 'post',
    'contentType': 'application/json', 
    'headers': headers,
    'payload' : payload,
};
var response = UrlFetchApp.fetch(url, options);
}

Теперь мне нужно автоматизировать это, но я не знаю как:

  1. (это вопрос электронной таблицы) IFTTT заполняет столбец «крайний срок» в этом формате «10 апреля 2017 г. в 13:54», однако необходимый формат для API - «2017-04-10T13: 54», как его автоматически изменить?

  2. чтобы получить значения из ячеек листа (из lastRow) и отправить их throw json payload

  3. для установки триггерного события, чтобы скрипт запускал каждый раз, когда IFTTT заполнял новую строку на листе.

Спасибо!


person Lucian Medisan    schedule 10.04.2017    source источник


Ответы (1)


Постараемся по очереди ответить на вопросы:

1) Дата переформатирования: вы можете использовать служебные программы .formatDate () в скрипте приложений, чтобы изменить дату.

Код:

function reformatDate(dtStr)
{
 if (dtStr == undefined)
 dtStr = "April 1, 2017 at 01:54PM"

 dtStr = dtStr.replace("at", "") // Remove at
 dtStr = dtStr.replace(/(\d)(PM)/g,"$1 $2") //Add a space between the time and PM
 dtStr = dtStr.replace(/(\d)(AM)/g,"$1 $2") //Add a space between the time and AM
 Logger.log(dtStr)

 dtStr = new Date(dtStr)
 var newDt = Utilities.formatDate(dtStr, SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "yyyy-MM-dd'T'HH:mm") 
 Logger.log(newDt)

 return newDt
}

2) Получить значения последней строки: вы можете использовать функции getLastRow() и getValues() в скриптах приложений.

function lastRowData(){
 var ss = SpreadsheetApp.getActive()
 var sheet = ss.getActiveSheet()
 var lastRow = sheet.getLastRow() 
 var lastCol = sheet.getLastColumn()
 var lastRowData = sheet.getRange(lastRow,1,1,lastCol).getValues()
 return lastRowData[0]

}

Изменить

Чтобы получить значения как есть, то есть отображаемые значения на листе, вы можете изменить getvalues ​​на getDisplayValues ​​() следующим образом:

var lastRowData = sheet.getRange(lastRow,1,1,lastCol).getDisplayValues()

3) Включите ваш лист: я не буду изобретать велосипед здесь. Но предоставлю вам отличный ответ от @Mogsdad Ссылка: Отправлять электронное письмо, когда ячейка записывается из другого приложения (IFTTT)

Короче говоря, вам нужно будет использовать onEdit Trigger для обнаружения новых записей.
Если при редактировании не работает, попробуйте изменить триггер.

Полный код:

function myFunction() {
var lastRow = lastRowData()
var data = {

    'department':     lastRow[0],
    'first_name' :    lastRow[1],
    'last_name' :     lastRow[2],
    'email' :         lastRow[3]',
    'phone' :         [lastRow[4]],
    'deadline' :      reformatDate(lastRow[5])
}

var payload = JSON.stringify(data)  

var headers = {

     'AUTHORIZATION': 'Token b8473654v6345teryrby456yrtyrtyertytdvfh87afc',
     // Add any other required parameters for XXX API.
};
var url = 'http://api.XXX.com/api/1.0/clients/';
var options = {
    'method': 'post',
    'contentType': 'application/json', 
    'headers': headers,
    'payload' : payload,
};
var response = UrlFetchApp.fetch(url, options);
}

Надеюсь, это поможет!

person Jack Brown    schedule 10.04.2017
comment
Номер отдела - 1.0, мне нужен 1 (без десятичных знаков). Номер телефона неверен, мне нужно 10 цифр «Нет», мой текущий номер 727656656, а мне нужно 0727656656. [код] function createSpreadsheetEditTrigger () {var ss = SpreadsheetApp.getActive (); ScriptApp.newTrigger ('PipeLine') .forSpreadsheet (ss) .onEdit () .create (); } [код] Это фрагмент кода для триггера, но он не работает должным образом (он запускается, когда я изменяю ячейку на листе. Но он не работает, когда новая строка автоматически вставляется IFTTT. - person Lucian Medisan; 12.04.2017
comment
Я отредактировал приведенный выше ответ, чтобы отображаемое значение отображалось как есть! - person Jack Brown; 12.04.2017
comment
Что касается триггера, не могли бы вы вместо этого попробовать событие onChange и посмотреть, запускается ли оно обновлением от IFTTT. - person Jack Brown; 12.04.2017
comment
Он работает с onChange. Вот код триггерной [code] функции onChange (e) {var ss = SpreadsheetApp.getActive (); ScriptApp.newTrigger ('PipeLine') .forSpreadsheet (ss) .onChange () .create (); } [код] Но getDisplayValues ​​() ничего не делает. может потому что текст в таком формате пришел от IFTTT, телефона нет. он без 0, поэтому мне нужно использовать команду .replace, чтобы изменить его. Я пробовал использовать произвольный числовой формат, он визуально работает (я вижу изменение в листе), но скрипт не получает нужный формат. Еще раз спасибо !!! - person Lucian Medisan; 13.04.2017
comment
Джек Браун. Заметил проблему с функцией dataReformat. Неправильное время, именно минуты. Например, 1 апреля 2017 г. в 13:54 он переформатирован в 2017-04-01T13: 05. Это сокращает последнее «нет». из минутного формата (в данном примере 4). Проблема сохраняется с любой комбинацией чисел или форматом PM / AM. Tx. - person Lucian Medisan; 18.04.2017
comment
Запустите функцию переформатирования и просмотрите журналы. Сообщите мне, какой результат. - person Jack Brown; 18.04.2017
comment
Это именно то, что я сделал. Я думаю, проблема в dtStr = dtStr.replace (/ \ d (PM) / g, PM) и dtStr = dtStr.replace (/ \ d (AM) /, AM) - person Lucian Medisan; 18.04.2017
comment
Большое тебе спасибо!!! У меня есть еще один вопрос, но он касается следующего шага в моем маленьком журнале вызовов. Итак, я отправлю новый вопрос. Еще раз спасибо за вашу помощь. - person Lucian Medisan; 19.04.2017