【问题标题】:Apps Script trigger API call on every new rowApps 脚本在每个新行上触发 API 调用
【发布时间】: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


【解决方案1】:

为此,您可以创建一个自定义公式函数。

创建这个:

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) {
//...
  sheet.getRange(lastRow + 1, 6).setValue(params);  
  sheet.getRange(lastRow + 1, 7).setValue(getEmailFromParams(params));  
  SpreadsheetApp.flush();
//...
}

function doPost(e) {
//...
  sheet.getRange(lastRow + 1, 6).setValue(params);  
  sheet.getRange(lastRow + 1, 7).setFormula("=getEmailFromParams(F"+(lastRow+1)+")");  
  SpreadsheetApp.flush();
//...
}

希望这会有所帮助!

【讨论】:

  • 请检查底部的原始帖子我更新了代码但它不起作用。我做错了什么?
  • 请帮忙?我不确定代码是不起作用还是我放错了位置
  • 它根本不更新第 7 列的任何内容
  • 你好@sebas,很抱歉这个错误!在您的情况下,请将 SetFormula 更改为 SetValue。阅读this 以帮助您了解我创建这两种方法的原因。
  • @ZekctorH 我确实在我的原始帖子和脚本本身上更新了该函数,但它仍然无法正常工作。它仅将值发布到第 7 列,即使使用 setvalue 也不会更新第 7 列的任何信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多