我已经完成并使用了一些很好的代码来形成这些表单,用于使用Applescript将内容从邮件添加到Excel。我快到了,但还有一个问题。
我有以下电子邮件布局
From: xxxxxx
Gender: xxxxxx
Age: >18 - 24
Phone Day: xxxxxx
Mobile:
Address: xxxxx
xxxxx
xxxx
xxxx
请注意,每一行都有一个简介(例如“From:”),这些内容正在被正确拉入。我的问题是添加“地址:”行的第2,3和4行,因为它没有介绍。
有什么想法吗?
这是我到目前为止所使用的。
感激不尽的任何帮助。
--APPLESCRIPT
_main()
on _main()
set mm to {}
tell application "Mail"
repeat with m in (get selection)
set mm's end to m's content & linefeed
end repeat
end tell
set r to my _retrieve_data(mm)
do shell script "printf '%s' " & r's quoted form & " > ~/desktop/$(date +scores_%F_%H%M%S.csv)"
return r
end _main
on _retrieve_data(mm)
(*
list mm : list of message text
*)
script o
property pp : mm
property qq : {}
property rr : {}
property boundary : do shell script "uuidgen" without altering line endings -- UUID & LF
property batch : 50 -- number of messages to be processed at once; combined text should not exceed ca. 200K
-- divide messages into batches
repeat with i from 1 to count my pp by batch
set j to i + batch - 1
if j > (count my pp) then set j to -1
set my qq's end to my pp's items i thru j
end repeat
-- retrieve data per batch
repeat with q in my qq
set my rr's end to do shell script "perl -CSDA -w <<'EOF' - " & boundary's quoted form & "
use strict;
local $\\ = qq(\\n);
local $, = qq(,);
my $boundary = shift;
my @data = ();
my ($new, $complete, $i) = (1, 0, -1);
while (<DATA>) {
next if ! ($new ||= $_ =~ /^$boundary$/) && $complete;
if ( $new ) {
($new, $complete) = (0, 0);
++$i;
}
/^From:\\s*(.+?)\\s*$/o && do { $data[$i]{from} = $1; next; };
/^Gender:\\s*(.+?)\\s*$/o && do { $data[$i]{gender} = $1; next; };
/^Age:\\s*(.+?)\\s*$/o && do { $data[$i]{age} = $1; next; };
/^Mobile:\\s*(.+?)\\s*$/o && do { $data[$i]{mobile} = $1; next; };
/^Phone Day:\\s*(.+?)\\s*$/o && do { $data[$i]{phoneday} = $1; next; };
/^Address:\\s*(.+?)\\s*$/o && do { $data[$i]{address1} = $1; next; character id(200);};
/^Address:\\s*(.+?)\\s*$/o && do { $data[$i]{address2} = $1; next; };
/^Address:\\s*(.+?)\\s*$/o && do { $data[$i]{address3} = $1; next; };
/^Address:\\s*(.+?)\\s*$/o && do { $data[$i]{address4} = $1; next; };
/^Email:\\s*(.+?)\\s*$/o && do { $data[$i]{email} = $1; next; };
/^I would like to be kept up to date on future Eden events, competitions and special offers\\s*(.+?)\\s*$/o && do { $data[$i]{eden} = $1; next; };
/^I would like to be kept up to date on future Kuoni events, competitions and special offers\\s*(.+?)\\s*$/o && do { $data[$i]{Kuoni} = $1; next; };
$complete = (0 + keys %{$data[$i]} == 12);
}
my @keys = ('from', 'gender', 'age', 'mobile', 'phoneday', 'address1', 'address2','address3','address4','email', 'eden', 'kuoni' );
print map { s/\"/\"\"/og; qq(\"$_\") } @keys;
for (@data) {
print map { $_ = '' unless defined $_; s/\"/\"\"/og; qq(\"$_\") } @{$_}{@keys};
}
__END__
" & _join(q, boundary) & "
EOF" without altering line endings
end repeat
-- combine data from each batch
set r to my rr's item 1 -- include header
repeat with i from 2 to count my rr -- exclude header for rest
set r to r & my rr's item i's text from paragraph 2 to text -1
end repeat
return r
end script
tell o to run
end _retrieve_data
on _join(tt, d)
(*
list tt : source list
string d : separator
return string : tt joined with d
*)
local astid0, t
try
set {astid0, AppleScript's text item delimiters} to {AppleScript's text item delimiters, {} & d}
set t to "" & tt
set AppleScript's text item delimiters to astid0
on error errs number errn
set AppleScript's text item delimiters to astid0
error errs number errn
end try
return t
end _join
--END OF APPLESCRIPT
如果有人感兴趣,下面是非常有用的代码。
--APPLESCRIPT
_main()
on _main()
set mm to {}
tell application "Mail"
repeat with m in (get selection)
set mm's end to m's content & linefeed
end repeat
end tell
set r to my _retrieve_data(mm)
do shell script "printf '%s' " & r's quoted form & " > ~/desktop/$(date +list_%F_%H%M%S.csv)"
return r
end _main
on _retrieve_data(mm)
(*
list mm : list of message text
*)
script o
property pp : mm
property qq : {}
property rr : {}
property boundary : do shell script "uuidgen" without altering line endings -- UUID & LF
property batch : 50 -- number of messages to be processed at once; combined text should not exceed ca. 200K
-- divide messages into batches
repeat with i from 1 to count my pp by batch
set j to i + batch - 1
if j > (count my pp) then set j to -1
set my qq's end to my pp's items i thru j
end repeat
-- retrieve data per batch
repeat with q in my qq
set my rr's end to do shell script "perl -CSDA -w <<'EOF' - " & boundary's quoted form & "
use strict;
local $\\ = qq(\\n);
local $, = qq(,);
my $boundary = shift;
my @data = ();
my ($new, $complete, $i, $j) = (1, 0, -1, 0);
while (<DATA>) {
next if ! ($new ||= $_ =~ /^$boundary$/) && $complete;
if ( $new ) {
($new, $complete) = (0, 0);
++$i;
}
/^From:\\s*(.+?)\\s*$/o && do { $data[$i]{from} = $1; $j=0; next; };
/^Gender:\\s*(.+?)\\s*$/o && do { $data[$i]{gender} = $1; $j=0; next; };
/^Age:\\s*(.+?)\\s*$/o && do { $data[$i]{age} = $1; $j=0; next; };
/^Mobile:\\s*(.+?)\\s*$/o && do { $data[$i]{mobile} = $1; $j=0; next; };
/^Phone Day:\\s*(.+?)\\s*$/o && do { $data[$i]{phoneday} = $1; $j=0; next; };
/^Email:\\s*(.+?)\\s*$/o && do { $data[$i]{email} = $1; $j=0; next; };
/^I would like to be kept up to date on future Eden events, competitions and special offers\\s*(.+?)\\s*$/o
&& do { $data[$i]{eden} = $1; next; };
/^I would like to be kept up to date on future Kuoni events, competitions and special offers\\s*(.+?)\\s*$/o
&& do { $data[$i]{kuoni} = $1; next; };
/^Address:\\s*(.+?)\\s*$/o && do { $data[$i]{address1} = $1; $j=1; next; };
$j == 1 && /^\\s*(.+?)\\s*$/o && do { $data[$i]{address2} = $1; $j++; next; };
$j == 2 && /^\\s*(.+?)\\s*$/o && do { $data[$i]{address3} = $1; $j++; next; };
$j == 3 && /^\\s*(.+?)\\s*$/o && do { $data[$i]{address4} = $1; $j++; next; };
$complete = (0 + keys %{$data[$i]} == 12);
}
my @keys = ('from', 'gender', 'age', 'mobile', 'phoneday', 'address1', 'address2','address3','address4','email', 'eden', 'kuoni');
print map { s/\"/\"\"/og; qq(\"$_\") } @keys;
for (@data) {
print map { $_ = '' unless defined $_; s/\"/\"\"/og; qq(\"$_\") } @{$_}{@keys};
}
__END__
" & _join(q, boundary) & "
EOF" without altering line endings
end repeat
-- combine data from each batch
set r to my rr's item 1 -- include header
repeat with i from 2 to count my rr -- exclude header for rest
set r to r & my rr's item i's text from paragraph 2 to text -1
end repeat
return r
end script
tell o to run
end _retrieve_data
on _join(tt, d)
(*
list tt : source list
string d : separator
return string : tt joined with d
*)
local astid0, t
try
set {astid0, AppleScript's text item delimiters} to {AppleScript's text item delimiters, {} & d}
set t to "" & tt
set AppleScript's text item delimiters to astid0
on error errs number errn
set AppleScript's text item delimiters to astid0
error errs number errn
end try
return t
end _join
--END OF APPLESCRIPT