从电子表格中提取邮件

时间:2017-02-18 22:27:35

标签: regex email google-apps-script formatting google-apps

我有一个包含两列的Google电子表格。

第一列包括引荐来源者的名称,第二列包括免费格式文本,其中提到了一些引用的电子邮件地址。一个单元格中可能有多个电子邮件地址,或者没有。

例如:

Referrer | Referral
--------------------------------------------------------------------------
Mister X | I would like to refer somebody@gmail.com and somebodyelse@outlook.com
Miss Y   | myfriend@mail.com
Mister Z | None!
etc      | ...

我想格式化数据,以便每个引用的地址都有引荐来源和引用的电子邮件地址。

EX:

Referrer | Referral
--------------------------------------------------------------------------
Mister X | somebody@gmail.com
Mister X | somebodyelse@outlook.com
Miss Y   | myfriend@mail.com
etc      | ...

实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

这是表格中的原始数据。

Referrer    Referral
Mister X    I would like to refer somebody@gmail.com and somebodyelse@outlook.com
Miss Y  myfriend@mail.com
Mister Z    None!

在写完之后,这是相同的列。

Referrer    none
Mister X    somebody@gmail.com
Mister X    somebodyelse@outlook.com
Miss Y  myfriend@mail.com
Mister Z    none

这是代码。目前,您按照我们的显示选择了两列,然后我按照您要求的格式编写它们。虽然有这样一个有限的数据集,但永远不能100%肯定。所以进一步测试会很好。我包括了菜单和一些帮助我调试程序的显示例程。我想你可能想改变范围。去吧。玩得开心。我很喜欢写它。

function onOpen()
{
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('My Tools')
        .addItem('Extract Emails','emailFishing')
        .addToUi();
}


    function emailFishing()
{
  var rng = SpreadsheetApp.getActiveRange();
  var rngA = rng.getValues();
  var resultsA = [];
  //var s = '[';
  for(var i = 0;i < rngA.length; i++)
  {
    if(rngA[i][1])
    {
      matchA = extractEmails(rngA[i][1]);
      if(matchA)
      {
        for(var j = 0; j < matchA.length;j++)
        {
           resultsA.push([rngA[i][0], matchA[j]]);
           //s += '[' + rngA[i][0] + ', ' + matchA[j] + '], '
        }
      }
      else
      {
        resultsA.push([rngA[i][0],'none']);
        //s += '[' + rngA[i][0] + ', \'none\'],'
      }
    }
  }
  //s += ']';
  var orng = SpreadsheetApp.getActiveSheet().getRange(rng.getRow(), rng.getColumn(), resultsA.length, resultsA[0].length);
  orng.setValues(resultsA);
  //dispStatus('Results Array', s, 500, 400);
}


function extractEmails (text)
{
    return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi);
}

function dispStatus(title,html,width,height)
{
// Display a modeless dialog box with custom HtmlService content.
  var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
  var width = typeof(width) !== 'undefined' ? width : 250;
  var height = typeof(height) !== 'undefined' ? height : 300;
  var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
  var htmlOutput = HtmlService
     .createHtmlOutput(html)
     .setWidth(width)
     .setHeight(height);
  SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
} 

函数extractEmail来自Leniel Macaferi。来自这篇文章Extract all email addresses from bulk text using jquery。虽然我遗漏了JQuery部分。