Aggiunta di contenuto da posta elettronica a Excel tramite Applescript

2

Ho esaminato e utilizzato un ottimo codice sotto forma di questi moduli per l'aggiunta di contenuto da posta elettronica a Excel tramite Applescript. Sono quasi arrivato ma ho ancora una domanda.

Ho il seguente layout di un'email

From: xxxxxx
Gender: xxxxxx
Age: >18 - 24
Phone Day: xxxxxx
Mobile:
Address: xxxxx
xxxxx
xxxx
xxxx

Nota che ogni riga ha un'introduzione "Da:", questo contenuto viene inserito correttamente. Il mio problema è l'aggiunta delle linee 2,3 e 4 dell'indirizzo perché non ha intro.

Qualche idea?

Questo è quello che ho usato fino ad ora.

Qualsiasi aiuto ricevuto con gratitudine.

--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

se qualcuno è interessato di seguito è riportato un codice modificato che funziona molto bene.

    --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
    
posta Tim Vaughan 13.07.2015 - 18:22
fonte

1 risposta

1

Codice corretto sotto per interesse.

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

    /^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; };


/^I would like to be kept up to date on future Eden events, competitions and special offers\s*$/o  
                                    && do { $data[$i]{eden}     = '1'; $j=0; next; };
    /^I would like to be kept up to date on future Kuoni events, competitions and special offers\s*$/o
                                    && do { $data[$i]{kuoni}    = '1'; $j=0; next; };

$complete = (0 + keys %{$data[$i]} == 12);
}

my @keys = ('from','gender','age','mobile','phoneday','email','address1','address2','address3','address4','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
    
risposta data 14.07.2015 - 15:24
fonte

Leggi altre domande sui tag