我希望从 Google Docs/Excel 中的文本字符串中提取电子邮件地址并自动发送电子邮件,其中单元格的内容目前未知(直到用户更新)。
例如,他们可能会读到:
你好,
我的朋友[电子邮件保护]。
谢谢,
例子乔
或者
你应该问
我现在得到了这个公式:
=IFERROR((LEFT(CELL,FIND("@",CELL)-1))&"@"&(regexextract(CELL,"@(.*)")))
它适用于几乎所有情况,除了
a) 如示例 1 所示,有人在电子邮件末尾添加 , 或 .
b) 如示例 2 中所示,电子邮件从新行开始,形式为例如。
问
我该如何调整公式来纠正这些问题?
答案1
对于 Google 电子表格
Google 电子表格有这些很酷的内置正则表达式公式
我们使用第一个公式来提取邮件地址。将此公式放入 Google 电子表格单元格中:
=iferror(Regexextract(A1;"[A-z0-9._%+-]+@[A-z0-9.-]+\.[A-z]{2,4}");"")
A1
是要检查的字符串(在您的情况下是邮件正文)应该驻留的单元格- 完整的公式由两部分组成。内部部分是正则表达式公式,外部部分用于错误预防
Regexextract(A1,"\[A-z0-9._%+-\]+@\[A-z0-9.-\]+\.\[A-z\]{2,4}")
返回邮件地址iferror(innerformula,"")
防止#N/A
当正则表达式无法返回任何内容时,例如未找到有效的邮件地址
正则表达式模式如何工作?
[A-z0-9._%+-]+@[A-z0-9.-]+.[Az]{2,4}
A-z
A
表示介于 an和 a之间的任意字符z
。
注意大小写。这样就不区分大小写0-9
代表任意数字._%+-
本身就代表这些符号[ ]
表示允许在括号内出现的单个字符- 把符号放在
+
后面[ ]
可以让之前的模式无限重复 @
没有特殊含义。它实际上是在寻找一个@
标志[A-z0-9.-]+
与上文相同。但这次_%+
不允许在标志后面@
\.
搜索单个点。它必须用前面的转义,\
因为.
占位符通常是任意字符- 最后
[A-z]{2,4}
搜索 2、3 或 4 个不区分大小写的字符
使用的资源
答案2
这是用于 Excel 的。
考虑以下用户定义函数(UDF):
Public Function GetEmailAddy(Sin As String) As String
Dim s As String
If InStr(1, Sin, "@") = 0 Then
GetEmailAddy = ""
Exit Function
End If
s = Replace(Sin, Chr(10), " ")
s = Replace(s, Chr(13), " ")
s = Application.WorksheetFunction.Trim(s)
ary = Split(s, " ")
For Each a In ary
If InStr(1, a, "@") > 0 Then
GetEmailAddy = a
Exit Function
End If
Next a
End Function
用户定义函数 (UDF) 非常容易安装和使用:
- ALT-F11 打开 VBE 窗口
- ALT-I ALT-M 打开新模块
- 粘贴内容并关闭 VBE 窗口
如果您保存工作簿,UDF 将随之保存。如果您使用的是 2003 之后的 Excel 版本,则必须将文件保存为 .xlsm 而不是 .xlsx
要删除 UDF:
- 调出如上所示的 VBE 窗口
- 清除代码
- 关闭 VBE 窗口
要从 Excel 使用 UDF:
=GetEmailAddy(A1)
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有关 UDF 的详细信息,请参阅:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
必须启用宏才能使其工作!
这里有些例子: