尝试将 post 数据从 Google 电子表格发送到外部 Api
Trying to post data from Google Spreadsheet to a external Api
我正在使用 Google SpreadSheet 和 IFTTT 来制作我的 phone 的数据库调用日志,这非常完美。
现在,我正尝试通过此数据库调用日志中的 API 在网页中填充表单。
每次 IFTTT 填充 Sheet 时,我都想将 lastRow 发送到我的 API。
Sheet 中的第一行填充了 headers 名称:部门、first_name、last_name、电子邮件、phone、截止日期。
所以我设法像这样将数据发送到 API:
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);
}
现在我需要让它自动化,但我不知道怎么做:
(这是一个 SpreadSheet 问题)IFTTT 以这种格式 "April 10, 2017 at 01:54PM" 填充 "deadline" 列,但是 API 所需的格式是“2017-04-10T13:54”,如何自动修改?
从 Sheet 个单元格(从 lastRow)获取值并发送它们 throw json payload
设置触发事件,以便脚本在每次 IFTTT 在 Sheet 中填充新行时触发。
谢谢!
会尽量一一回答问题:
1) 重新格式化日期:您可以在应用程序脚本中使用 Utilities.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," ") //Add a space between the time and PM
dtStr = dtStr.replace(/(\d)(AM)/g," ") //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]
}
编辑
要按原样获取值,即在 sheet 中显示的值,您可以将 getvalues 修改为 getDisplayValues(),如下所示:
var lastRowData = sheet.getRange(lastRow,1,1,lastCol).getDisplayValues()
3) 触发你的sheet:我不会在这里重新发明轮子。但是@Mogsdad 会为您提供一个很棒的答案
Link: Trigger an email when a cell is written into from another app (IFTTT)
简而言之,您将不得不使用 onEdit 触发器来检测新条目。
如果编辑不起作用,请尝试更改触发器。
完整代码:
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);
}
希望对您有所帮助!
我正在使用 Google SpreadSheet 和 IFTTT 来制作我的 phone 的数据库调用日志,这非常完美。 现在,我正尝试通过此数据库调用日志中的 API 在网页中填充表单。 每次 IFTTT 填充 Sheet 时,我都想将 lastRow 发送到我的 API。 Sheet 中的第一行填充了 headers 名称:部门、first_name、last_name、电子邮件、phone、截止日期。
所以我设法像这样将数据发送到 API:
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);
}
现在我需要让它自动化,但我不知道怎么做:
(这是一个 SpreadSheet 问题)IFTTT 以这种格式 "April 10, 2017 at 01:54PM" 填充 "deadline" 列,但是 API 所需的格式是“2017-04-10T13:54”,如何自动修改?
从 Sheet 个单元格(从 lastRow)获取值并发送它们 throw json payload
设置触发事件,以便脚本在每次 IFTTT 在 Sheet 中填充新行时触发。
谢谢!
会尽量一一回答问题:
1) 重新格式化日期:您可以在应用程序脚本中使用 Utilities.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," ") //Add a space between the time and PM
dtStr = dtStr.replace(/(\d)(AM)/g," ") //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]
}
编辑
要按原样获取值,即在 sheet 中显示的值,您可以将 getvalues 修改为 getDisplayValues(),如下所示:
var lastRowData = sheet.getRange(lastRow,1,1,lastCol).getDisplayValues()
3) 触发你的sheet:我不会在这里重新发明轮子。但是@Mogsdad 会为您提供一个很棒的答案 Link: Trigger an email when a cell is written into from another app (IFTTT)
简而言之,您将不得不使用 onEdit 触发器来检测新条目。
如果编辑不起作用,请尝试更改触发器。
完整代码:
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);
}
希望对您有所帮助!