2 votes

Ajouter le contenu d'un courrier à Excel à l'aide d'Applescript

J'ai parcouru et utilisé un excellent code à partir de ces formulaires pour ajouter le contenu du courrier à Excel en utilisant Applescript. J'ai presque terminé mais j'ai encore une question.

J'ai la présentation suivante d'un courrier électronique

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

Remarquez que chaque ligne comporte une intro "From :", ce contenu est correctement intégré. Mon problème est d'ajouter les lignes 2, 3 et 4 de l'adresse car elles n'ont pas d'intro.

Qu'en pensez-vous ?

Voici ce que j'ai utilisé jusqu'à présent.

Toute aide est la bienvenue.

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

si quelqu'un est intéressé, voici un code modifié qui fonctionne à peu près correctement.

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

1voto

user1978786 Points 265

Code correct ci-dessous pour intérêt.

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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X