首页 > 解决方案 > 谷歌脚本:将正则表达式匹配到二维数组

问题描述

我正在尝试将 Gmail 中的信息提取到 Google 电子表格中。电子邮件中的信息具有表格结构,其中包含以下列产品列表、已售数量和每个产品的小计。这些重复N次。

使用访问信息时,message.getPlainBody()我得到以下文本:


Product
Quantity
Price
Chocolate
1
$8.58
Apples
2
$40.40
Bananas
1
$95.99
Candy
1
$4.99
Subtotal:
$149.96

进步

首先,我尝试使用正则表达式来识别每一行的所有元素:

把所有东西都包起来看起来像这样

    function ExtractDetail(message){
      var mainbody = message.getPlainBody();

     //RegEx
     var itemListRegex = new RegExp(/(.*)[^:][\r\n]+(\d*[\r\n]+[$](\d*\.\d*)[\r\n]+/g);
     var itemList = mainbody.match(itemListRegex);
     Logger.log(itemList);
    }

到目前为止它有效:

在此处输入图像描述

itemList: 巧克力 1 $8.58 , 苹果 2 $40.40 , 香蕉 1 $95.99 , 糖果 1 $4.99

但是,我得到以下结果:

代替:

问题

我的问题是,如何以每行对应于找到的每个匹配并且每列对应于每个属性的方式追加新行?

如何将每个匹配的结果转换为数组?有可能还是我应该改变我的方法?

更新:

由于我当前尝试的结果是一个大字符串,我正在尝试寻找其他选项。出现了这个:

var array = Array.from(mainbody.matchAll(itemListRegex), m => m[1]);

来源:您如何访问 JavaScript 正则表达式中的匹配组?

我还在努力。我仍然需要找到如何添加更多列,并且由于某种原因它从“Apples”开始(按照示例),而将“Chocolates”留在后面。

日志:

Logger.log('array: ' + array);

在此处输入图像描述

标签: regexgoogle-apps-scriptmultidimensional-arraygoogle-sheets

解决方案


如果你想使用matchAlllike Array.from(mainbody.matchAll(itemListRegex), m => m[1]),这个修改怎么样?

在这种情况下,/(.*[^:])[\r\n]+(\d*)[\r\n]+([$]\d*\.\d*)[\r\n]/g用作正则表达式。

修改后的脚本:

const itemListRegex = /(.*[^:])[\r\n]+(\d*)[\r\n]+([$]\d*\.\d*)[\r\n]/g;
var array = Array.from(mainbody.matchAll(itemListRegex), ([,b,c,d]) => [b,Number(c),d]);

结果:

[
  ["Chocolate",1,"$8.58"],
  ["Apples",2,"$40.40"],
  ["Bananas",1,"$95.99"],
  ["Candy",1,"$4.99"]
]

脚本测试:

const mainbody = `
Product
Quantity
Price
Chocolate
1
$8.58
Apples
2
$40.40
Bananas
1
$95.99
Candy
1
$4.99
Subtotal:
$149.96
`;

const itemListRegex = /(.*[^:])[\r\n]+(\d*)[\r\n]+([$]\d*\.\d*)[\r\n]/g;
var array = Array.from(mainbody.matchAll(itemListRegex), ([,b,c,d]) => [b,Number(c),d]);
console.log(array)

笔记:

  • 关于how can I append a new row in a way that it each row corresponds to each match found and that each column corresponds to each property?,这意味着将值放入电子表格?如果是这样,您能否提供您期望的样本结果?

参考:


推荐阅读