【问题标题】:Search an element from a parsed JSON string array in google apps script从谷歌应用脚​​本中解析的 JSON 字符串数组中搜索元素
【发布时间】:2022-09-23 17:59:51
【问题描述】:

我将此 Google Apps 脚本绑定到工作表并作为网络应用程序发布,该应用程序充当网络挂钩来收集数据。这很好用,并且可以很好地收集脚本中的前两个结果(将数据插入工作表)。时间和完整的数据分别打包到第 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=真

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

    谢谢阅读。

  • 您是否尝试过在调试模式下运行并在代码右侧的查看器中检查变量?这通常会提供一些关于数据结构的重要线索。
  • 是的,我试过这个,但我只看到这个
  • 错误类型错误:无法读取未定义 doPost @ Code.gs:3 的属性 \'postData\'
  • 那个 Json 有问题。即使您将其粘贴到其他阅读器中,它的结构也不正确。使用 jsonviewer.stack.hu 并将您的 pull 与标准 json 进行比较,例如 pastebin.com/raw/3FJaqdJC
  • 这很奇怪,我是从支付网关收集的,但我无法控制结构。您是否知道无论其结构如何都对字符串执行搜索以检索结果。也许正则表达式提取?

标签: arrays json google-apps-script webhooks


【解决方案1】:

正如 cmets 中提到的,输入绝对不是 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 后的结果:

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

作为奖励,您的原始代码在 JSON 解析时失败,因为输入无法解析为 JSON,但如果它有效,则此代码会起作用:

function doPost(e) {

  var jsonString = e.postData.contents;
  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, 4).setValue(event.amount);
  sheet.getRange(lastRow + 1, 5).setValue(event.reference);
  sheet.getRange(lastRow + 1, 6).setValue(event.metadata.is_supplementary);
}

这就是有效的 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}

并格式化:

{
   "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
}

【讨论】:

  • 谢谢你的详细回答,丹尼尔;但是,当我尝试您建议的代码时,我只得到第 1 列中返回的日期?
  • 你尝试了第一个街区还是第二个街区? POST 数据是什么样的?
【解决方案2】:

丹尼尔

我现在修改了 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 格式接收的 post 数据:

{"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"}}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 2011-12-22
    • 2021-12-26
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多