Apps Script вызывает API-вызов в каждой новой строке - PullRequest
0 голосов
/ 03 октября 2019

Этот сценарий приложения прослушивает запрос 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"}

Мне нужнозапустить вызов API на основе значения url in params, вернуть значение электронной почты и отправить его обратно в соответствующую строку на листе.

, поэтому для приведенного выше примера вызова 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");

}

1 Ответ

0 голосов
/ 04 октября 2019

Чтобы получить это, вы можете создать пользовательскую функцию формулы.

Создайте это:

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();
//...
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...