Trying to post data from Google Spreadsheet to a external Api

纵饮孤独 提交于 2019-12-21 03:18:21

问题


I'm using Google SpreadSheet and IFTTT to do a DB Call Log of my phone, this is working perfect. Now I'm trying to populate a form in a web page by API from this DB Call Log. I would like to send lastRow to my API every time IFTTT populate the Sheet. The first Row in the Sheet is populated with headers name: departament, first_name, last_name, email, phone, deadline.

So i manage to send data to API like this:

function myFunction() {

var data = {

    'department':     1,
    'first_name' :    'Test',
    'last_name' :     'test',
    'email' :         'email@gmail.com',
    '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);
}

Now i need to automate it but i don't know how:

  1. (this is a SpreadSheet question) IFTTT populate the "deadline" column in this format "April 10, 2017 at 01:54PM" however the needed format for API is "2017-04-10T13:54", how to auto modify it?

  2. to get the values from Sheet cells (from lastRow) and send them throw json payload

  3. to set a trigger event so the script trigger's every time IFTTT populates a new Row in the Sheet.

Thank you!


回答1:


Will try to answer the question one by one:

1) Reformat date: You can use Utilities.formatDate() in apps script to modify your date.

Code:

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) Get last row Values: You can use getLastRow() and getValues() functions in apps scripts

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]

}

Edit

To get values as is i.e. displayed values in the sheet, you can modify the getvalues to getDisplayValues() like so:

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

3) Trigger your sheet: I will not reinvent the wheel here. But will provide you with an awesome answer from @Mogsdad Link: Trigger an email when a cell is written into from another app (IFTTT)

In short, you will have to use onEdit Trigger to detect new entries.
If on edit doesn't work, try on Change trigger.

Complete code:

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);
}

Hope that helps!



来源:https://stackoverflow.com/questions/43322325/trying-to-post-data-from-google-spreadsheet-to-a-external-api

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!