繁体   English   中英

在 Google Apps 脚本中从已解析的 JSON 字符串数组中搜索元素

[英]Search an element from a parsed JSON string array in google apps script

我将此 Google Apps 脚本绑定到工作表并作为 web 应用程序发布,该应用程序充当收集数据的 webhook。 这很好用,并且可以很好地收集脚本中的前两个结果(将数据插入工作表)。 时间和完整数据 package 分别放入第 1 列和第 3 列。

function doPost(e) {

var jsonString = e.postData.getDataAsString();
var event = JSON.parse(jsonString)
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Data");
var timeStamp = new Date();
var time = Utilities.formatDate(timeStamp, "BST", "dd/MM/yyyy, h:mm a");
var lastRow = sheet.getLastRow();

//Insert the data into the sheet  
sheet.getRange(lastRow + 1, 1).setValue(time); 
sheet.getRange(lastRow + 1, 3).setValue(event["data"]);
sheet.getRange(lastRow + 1, 6).setValue(data.reference);
}

从第 3 列中的 webhook 检索到的信息在解析后就是这种格式,但我正在努力使用谷歌应用程序脚本在这个解析的 JSON 字符串数组中搜索一个元素,并希望有人能指出我正确的方向。

{processing={acquirer_reference_number=24022122407531018095, acquirer_transaction_id=57631018089}, id=pay_n4m745lnx7uy2tmgx4z26mksi, action_id=act_qqno6t6jctdkzbuk2fu3js71e, response_summary=Approved, metadata={is_supplementary=True, ps_id=9, token=tok_war7hee5nole7d21bknt45dm, transaction=7125, hash=84c478fdfbdb2515d46542adbd6ggd516dc0048fd67, order_id=83245142, sandbox=0}, amount=271.0, processed_on=2022-09-21T13:35:32Z, response_code=10000, currency=USD, reference=2694931}

我真的很想在数据中搜索这三个元素并将它们分别返回到第 4、5 和 6 列。 这些出现的顺序似乎是随机的,所以我不能依赖索引:

  1. 金额=271.0
  2. 参考=2694931
  3. is_supplementary=真

您可以看到我尝试使用点表示法,并且我也尝试过括号表示法,但无济于事。

谢谢阅读。

正如评论中提到的,输入绝对不是 JSON,尝试转换它看起来很困难。 我认为正则表达式会是更简单的方法。 这是与您的输入一起使用的示例:

function doPost(e) {

  var notJsonString = e.postData.contents;
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Data");
  var timeStamp = new Date();
  var time = Utilities.formatDate(timeStamp, "BST", "dd/MM/yyyy, h:mm a");
  var nextRow = sheet.getLastRow()+1;

  //Insert the data into the sheet  
  sheet.getRange(nextRow, 1).setValue(time);
  sheet.getRange(nextRow, 4).setValue(extractAfter("amount=", notJsonString));
  sheet.getRange(nextRow, 5).setValue(extractAfter("reference=", notJsonString));
  sheet.getRange(nextRow, 6).setValue(extractAfter("is_supplementary=", notJsonString));
}

function extractAfter(str, source){
  var regex= new RegExp(`(?<=(${str}))[^,}\s]*`)
  return regex.exec(source)[0]
}

这是向 WebApp 发送 POST 后的结果:

在此处输入图像描述

正则表达式(?<=(your_string))[^,}\s]*是一个后向your_string 模式之后和 a , 、 a }或空格之前的任何字符串。 根据您输入的类似 JSON 的格式,无论它是在哪里生成的,它都应该得到正确的值,但如果您想要获得一个包含被排除字符之一的值,您可能会遇到问题。

丹尼尔

我现在修改了 GAS,随后,我正在检索 JSON 中的帖子,见下文,但我仍然无法从中收集元素。 我想在第 4 列中获得一个值,但点符号似乎不起作用。

function doPost(e) {
  var jsonString = e.postData.getDataAsString();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Import");
  var timeStamp = new Date();
  var time = Utilities.formatDate(timeStamp, "GMT", "dd/MM/yyyy, h:mm a");
  var nextRow = sheet.getLastRow()+1;

  //Insert the data into the sheet  
  sheet.getRange(nextRow, 1).setValue(time);
  sheet.getRange(nextRow, 3).setValue(jsonString);
  sheet.getRange(nextRow, 4).setValue(jsonString.amount);
}

这是以 JSON 格式收到的发布数据:

{"id":"evt_l4wuy3s85ieqko2jyd5ndrakfa","type":"payment_captured","created_on":"2022-09-23T09:44:15Z","data":{"action_id":"act_vcmb5fho27l2d7yf54i7uggggy","response_code":"10000","response_summary":"Approved","amount":2980,"metadata":{"sandbox":"0","hash":"3dd6w92a99eaf5ef045e5f1d702b73dg0983b060","card_token":"tok_vd65f37ss5sejf5lshlbiaklve","ps_id":"9","order_id":"55300847","transaction":"6720","is_supplementary":"False"},"processing":{"acquirer_transaction_id":"87543695702","acquirer_reference_number":"24023212166085436959085"},"id":"pay_a47jsqd5gj6kxerj33xjwarwai","currency":"GBP","processed_on":"2022-09-23T09:44:15Z","reference":"2698535"},"_links":{"self":{"href":"https://api.paygateway.com/events/evt_k4wuy3sf6ieejo2jye5jdrak6a"},"payment":{"href":"https://api.paygateway.com/payments/pay_a4cjsqs6la6kxerj33xjws2wai"}}}

这是绑定到工作表并作为 web 应用程序发布的最终 Google Apps 脚本,该应用程序充当收集数据的 webhook。

这很有效,可以从 JSON 有效负载中收集数据。 我可以访问 JSON 有效负载中的元素,并在 Google 表格的特定单元格中设置值。

我之前使用 Zapier 作为 webhook 来处理这个,但是任务量越来越大,所以使用这种方法应该更好更便宜!

我希望将来有人会发现这很有用。

function doPost(e) {

  var jsonString = e.postData.getDataAsString();
  var event = JSON.parse(jsonString)
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Import");
  var timeStamp = new Date();
  var time = Utilities.formatDate(timeStamp, "GMT+1", "dd/MM/yyyy, h:mm a");
  var nextRow = sheet.getLastRow()+1;

  //Insert the data into the sheet  
  sheet.getRange(nextRow, 1).setValue(time);
  sheet.getRange(nextRow, 3).setValue(jsonString);
  sheet.getRange(nextRow, 4).setValue(event.data.amount);
  sheet.getRange(nextRow, 5).setValue(event.data.metadata.is_supplementary);
  sheet.getRange(nextRow, 6).setValue(event.data.reference);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM