Google Script: сопоставить RegEx с 2D-массивом - PullRequest
1 голос
/ 04 апреля 2020

Я пытаюсь извлечь информацию из 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

Прогресс

Сначала я попробовал использовать регулярное выражение для идентификации каждой строки со всеми его элементами:

  • Название продукта: любое количество символов, которые не включают ':' (. *) [^:]
  • Кол-во Продано: Любое число \ d *
  • Все, что выглядит как подытог [$] \ d *. \ D *

Оборачивая все, это выглядит так

    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);
    }

И пока все работает:

enter image description here

itemList: Шоколад 1 $ 8,58, Яблоки 2 $ 40,40, Бананы 1 $ 95,99 , Candy 1 $ 4.99

Однако я получаю следующий результат:

  • [Шоколад 1 $ 8.58]
  • [Яблоки 2 $ 40.40]
  • [Бананы 1 $ 95,99]
  • [Конфеты 1 $ 4,99]

Вместо:

  • [Шоколад] [1] [$ 8,58]
  • [Яблоки] [2] [40,40 $]
  • [Бананы] [1] [95,99 $]
  • [Конфеты] [1] [$ 4.99]

Вопрос

Мой вопрос: как я могу добавить новую строку в как каждая строка соответствует каждому найденному совпадению и что каждый столбец соответствует каждому свойству?

Как превратить результат каждого совпадения в массив? Возможно ли это или я должен изменить свой подход?

Обновление:

Поскольку результатом моей текущей попытки является большая строка, я пытаюсь найти другие варианты. Это всплыло:

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

Источник: Как получить доступ к соответствующим группам в регулярном выражении JavaScript?

Я все еще работаю над этим , Мне все еще нужно найти, как добавить больше столбцов, и по какой-то причине он начинается с «Яблоки» (следуя примерам), оставляя после себя «Конфеты».

Журнал:

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

enter image description here

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Если вы хотите использовать matchAll как 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?, это означает для помещения значений в электронную таблицу? Если это так, можете ли вы предоставить пример результата, который вы ожидаете?

Ссылки:

2 голосов
/ 04 апреля 2020

Map и split результирующий массив из \n строк:

const data = `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;
const itemList = data.match(itemListRegex);

console.info(itemList.map(e => e.split(/\n/)));//map and split
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...