【发布时间】:2019-10-16 23:31:38
【问题描述】:
此应用脚本侦听 POST 请求并将数据返回到工作表中
//this is a function that fires when the webapp receives a GET request
function doGet(e) {
return HtmlService.createHtmlOutput("request received");
}
//this is a function that fires when the webapp receives a POST request
function doPost(e) {
var params = JSON.stringify(e.postData.contents);
params = JSON.parse(params);
var myData = JSON.parse(e.postData.contents);
var testRunUrl = myData.test_run_url;
var testRunName = myData.test_name;
var testRunEnv = myData.environment_name;
var testRunResult = myData.result;
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = Math.max(sheet.getLastRow(),1);
sheet.insertRowAfter(lastRow);
var timestamp = new Date();
sheet.getRange(lastRow + 1, 1).setValue(timestamp);
sheet.getRange(lastRow + 1, 2).setValue(testRunName);
sheet.getRange(lastRow + 1, 3).setValue(testRunEnv);
sheet.getRange(lastRow + 1, 4).setValue(testRunResult);
sheet.getRange(lastRow + 1, 5).setValue(testRunUrl);
sheet.getRange(lastRow + 1, 6).setValue(params);
SpreadsheetApp.flush();
return HtmlService.createHtmlOutput("post request received");
}
第6列参数值如下(示例)
{"resource":"https://api.mercadolibre.com/collections/notifications/2951993376","topic":"payment"}
我需要根据 params 值中的 url 触发 api 调用,并返回 email 值并将其发布回工作表中的相应行。
所以对于上面的示例 API 调用将是 url: https://api.mercadopago.com/v1/payments/2951993376?access_token=APP_USR-7641393791309669-082521-8426042efc7686ae9bff4b135f5gdhfa-270831598
对于每个新行,我需要触发 API 调用:
https://api.mercadopago.com/v1/payments/[ID]?access_token=APP_USR-7641393791309669-082521-8426042efc7686ae9bff4b135f5gdhfa-270831598
并将“payer.email”值返回到该行的第 7 列,对每个新行重复该值。
这个函数返回payer.email值
function myFunction() {
var url="https://api.mercadopago.com/v1/payments/5267820258?access_token=APP_USR-7641393791309669-082521-8426042efc76errae9bfg5513ff53dffa-270831598";
var response=UrlFetchApp.fetch(url);
var json=response.getContentText();
var data=JSON.parse(json)
var emailmercadopago=data.payer.email;
Logger.log(emailmercadopago);
}
示例表: https://docs.google.com/spreadsheets/d/1h1Ckrv_NM0evc_0ons_d6xZvy-DWy8rYIqG0vIHWMpg/edit?usp=sharing
但我无法按照我的意愿将它们组合在一起。 如何在添加的每个新行上触发此类 api 调用并将电子邮件返回到第 7 列工作表中的行
更新 这就是它现在的样子,但它不起作用:
function getEmailFromParams(params) {
var resource = JSON.parse(params).resource;
var id = resource.substring(resource.lastIndexOf('/')+1);
return getEmailFromid(id);
}
function getEmailFromid(id) {
var url="https://api.mercadopago.com/v1/payments/"+id+"?access_token=APP_USR-7641393791309669-082521-8426042efc7686ae9bff4b13ff53dffa-270831598";
var response=UrlFetchApp.fetch(url);
var json=response.getContentText();
var data=JSON.parse(json)
try {
var emailmercadopago=data.payer.email || "No Email";
return emailmercadopago;
} catch (err) {
return "Problem getting Email";
}
}
function doPost(e) {
var params = JSON.stringify(e.postData.contents);
params = JSON.parse(params);
var myData = JSON.parse(e.postData.contents);
var testRunUrl = myData.test_run_url;
var testRunName = myData.test_name;
var testRunEnv = myData.environment_name;
var testRunResult = myData.result;
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = Math.max(sheet.getLastRow(),1);
sheet.insertRowAfter(lastRow);
var timestamp = new Date();
sheet.getRange(lastRow + 1, 1).setValue(timestamp);
sheet.getRange(lastRow + 1, 2).setValue(testRunName);
sheet.getRange(lastRow + 1, 3).setValue(testRunEnv);
sheet.getRange(lastRow + 1, 4).setValue(testRunResult);
sheet.getRange(lastRow + 1, 5).setValue(testRunUrl);
sheet.getRange(lastRow + 1, 6).setValue(params);
sheet.getRange(lastRow + 1, 7).setValue(getEmailFromParams("F"+(lastRow+1)))
SpreadsheetApp.flush();
return HtmlService.createHtmlOutput("post request received");
}
【问题讨论】:
-
那么问题是什么?
-
@Cooper 如何在添加的每个新行上触发此类 api 调用并将电子邮件返回到第 7 列工作表中的行
-
你可以用这个
var vA=[[timestamp,testRunName,testRunEnv,testRunResult,testRunUrl,params]]; sheet.getRange(lastRow,1,1,6).setValues(vA);替换这个sheet.getRange(lastRow + 1, 1).setValue(timestamp); sheet.getRange(lastRow + 1, 2).setValue(testRunName); sheet.getRange(lastRow + 1, 3).setValue(testRunEnv); sheet.getRange(lastRow + 1, 4).setValue(testRunResult); sheet.getRange(lastRow + 1, 5).setValue(testRunUrl); sheet.getRange(lastRow + 1, 6).setValue(params); -
我不需要发送任何电子邮件,我只需要从 api 调用中获取电子邮件。请重新阅读
-
好的。那么答案仍然是为什么不直接从 doPost() 脚本启动它?
标签: google-apps-script google-sheets