鶴亀マクロ入門No.00233
ぱと さん 02/11/25 11:01
 
えっと、大変恐縮なのですが、この会議室はあまり発言数が多くないので、べた
べたに初心者な質問をさせていただいてもよろしいでしょうか?

現在、K2さんという方の TaskPrize という todo管理ソフトと鶴亀の連携のた
めのマクロを書こうとしております。

http://web.kyoto-inet.or.jp/people/koyabu/
http://web.kyoto-inet.or.jp/people/koyabu/tpz/taskprize2.html

この TaskPrize には、メーラーとの連携に関するインターフェースが用意されて
おり、メールをファイルに切り出して、-i という起動オプションでそのファイル
を渡すと、メールの内容を TaskPrize の「仕事」として取り込める機能がついて
おります。つまりメーラーとの連携では、メールクリッピング機能のようなもの
が実現できるわけです。

逆に、鶴亀の方には、/vf というオプションが用意されましたので、クリッピン
グした側に、この /vf オプションで利用できる情報が記載されていれば、
TaskPrize の側から、鶴亀の該当メールに逆ジャンプできます。

そこで、鶴亀のメールに、これらの情報を付加した形で、外部テキストファイル
に書き出すという部分のマクロを書こうとしております。

鶴亀の側で単一メールしか選択していない状態で、特別なエラー処理や、
TaskPrize の起動パスを取得する処理なども全て省くと、

loaddll "TKInfo.dll";
#n = dllfunc("Export", "c:\\export.txt", "mbox", "log");
run "C:\\Program Files\\TaskPrize2\\TskPrize.exe /ic:\export.txt";

というようなコードでこの連携マクロの雛形になるのですが、複数メールの処理
や、逆ジャンプに関する情報の付加のため、Export 機能を使わずに、自前で、
メールを加工して、ファイルに落とす必要があります。

そこで、鶴亀の側で、メール内容を加工してから、ファイルに落とすという処理
を行いたいのですが、どのようにすれば、こういう処理ができますでしょうか?

何か、質問を書いていて、あまりに取りとめが無いので自分でも恥ずかしくなり
ます。

とりあえずやりたいのは以下のようなことです。

複数メールの区切りは、行頭にピリオドだけの行として、複数メールを所定のフ
ァイルに落とす。(これが、TaskPrize が要求するフォーマットです。)

特定のヘッダの情報及び、ログのファイル名、オフセットを本文の前に一定のフ
ォーマットで情報を付加してから、上記の処理を行う。

本当にとりとめもなくて申し訳ございませんが、秀丸のマクロの経験もありませ
んし、そもそもマクロを含むプログラミング全体に初心者ですので、このあたり
を読んでから出直せなどでもかまいませんので、何かヒントをいただければと思
います。

----
ぱと

[ ]
RE:00233 鶴亀マクロ入門No.00234
かわした さん 02/11/25 11:29
 
かわしたです。

鶴亀マクロでは選択中の複数のメールを個別に処理することが基本
的にはできないので、最初にエクスポートしてそのファイルをテキ
ストファイルとして開き処理する形になるかと思います。複数ファ
イルの場合は例えば鶴亀形式でエクスポートして Ctrl+L を . に
置換するなどすればよいのではないでしょうか。(すいません未確
認です)

鶴亀マクロでテキストファイルを扱う方法は、マクロヘルプの「ヒ
ント集−テキストファイルを処理する」の中で詳しく説明されてい
るので参考になるかと思います。私もつい最近、初めてメールを加
工&保存するマクロを書いたのですが、ここのヘルプが非常に役立
ちました。

[ ]
RE:00234 鶴亀マクロ入門No.00235
ぱと さん 02/11/25 11:39
 
かわした さん

>鶴亀マクロでは選択中の複数のメールを個別に処理することが基本
>的にはできないので、最初にエクスポートしてそのファイルをテキ
>ストファイルとして開き処理する形になるかと思います。複数ファ
>イルの場合は例えば鶴亀形式でエクスポートして Ctrl+L を . に
>置換するなどすればよいのではないでしょうか。(すいません未確
>認です)

なるほど、貴重なヒントありがとうございます。その後ちょっと考えてから、

選択中のメールを特定のフォルダにコピーする
そのフォルダ内のメールを対象に、一つ一つメールを加工する処理をする
そのフォルダ内のメールを全て選択してエクスポートする

という手順を考えました。これなら、メールを加工するのに鶴亀の標準の機能を
使えばいいはずなので、少しは楽だろうと思ったのです。

エクスポートの際に、ピリオドのみの行で区切ると言うところがそれでも問題に
なりますが、エクスポートのオプションとして、複数メールをピリオドのみの行
で区切るというオプションを追加していただくわけにはいかないでしょうか?あ
るいは、逆に TaskPrize の方で、mbox 形式からのインポートを可能にしていた
だくようにお願いしてみようと思っています。

>鶴亀マクロでテキストファイルを扱う方法は、マクロヘルプの「ヒ
>ント集−テキストファイルを処理する」の中で詳しく説明されてい
>るので参考になるかと思います。私もつい最近、初めてメールを加
>工&保存するマクロを書いたのですが、ここのヘルプが非常に役立
>ちました。

なるほど、こんなところに貴重な情報があったのですね。こちらも大きなヒント
どうもありがとうございました。

少し試行錯誤してみます。

特定のフォルダの中のメールを一つ一つ、開いて、所定の処理をするという処理
を考えて見ます。この処理もどなたかヒントを下さると嬉しいです。

----
ぱと

[ ]
RE:00235 鶴亀マクロ入門No.00236
プックン さん 02/11/25 12:29
 
ぱとさん、かわしたさん こんにちは

TaskPrizeというソフトがよくわからないですが、こんな感じになるんですかね。
exportしたいメールを選択して、EXPORT.MACを実行すればいいと思います。
あまりデバックしてませんが、参考までに。

// 置換用マクロ
// REPLACE.MAC
$1 = "! " ;
$2 = "." ;
replaceallfast $1 ,$2 ;
save ;
exit;
// REPLACE.MAC 終わり


//----------------------EXPORT.MAC 始まり ----------------------

//----------------------------------------------------------------------//
//      鶴亀メール マクロ Export                                        //
//      マクロ名称  :  EXPORT.MAC Ver 1.00                              //
//                                                                      //
//      機能概要 :  鶴亀でexport(For TaskPrize)                         //
//                                                                      //
//      注意事項 :                                                      //
//                                                                      //
//      作 成 者 :  プックン                            2002年11月25日  //
//                  xxxxxx@livedoor.com                                 //
//      修正履歴 :                                                      //
// XXXX/XX/XX XXXXXXXX          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX//
// 2002.11.25 プックン  1.00    新規作成
$$ver  = "1.00";
$$date = "2002.11.25";
$$author = "プックン" ;
$$fname = currentmacrobasename ;
$$info = "\n" + $$fname + " Ver " + $$ver+ "\n最終更新日付:"+$$date ;
$$info = $$info + "\n作者:"+$$author ;

    call Turukame $$info;

//sample
    //鶴亀から起動されたかどうか確認
    ##n = dllfunc( "IsTuruKame" );
    //移動できたかどうかの確認(値のチェック)
    call Res_check ##n,"マクロの実行が、鶴亀からされていません。\n" + $$info ;

//出力先フォルダ
//$TempFile = "d:\\temp\\test\\export.txt" ;
$TempFile = "c:\\export.txt" ;

//置換用マクロ
    $mac = "REPLACE.MAC" ;
    $mac = macrodir + "\\" + $mac ;

    //メール選択状態
    ##Select = dllfunc("MailIndex");
    if(##Select == -1){
        message "メールが選択されていません" ;
        goto LEND
    }

    #n = dllfunc("Export", $TempFile, "turukame", "log");

    run hidemarudir + "\\hidemaru.exe /x" + $mac + " /h " + $TempFile ;

    //連携
//  run "C:\\Program Files\\TaskPrize2\\TskPrize.exe /i" + $TempFile ;


LEND:
    freedll;
    endmacro;

Turukame:   //鶴亀メール起動チェック&DLLロード
$$info = $$1;
    //鶴亀インストールフォルダを取得する。
    //戻り値 最後に"\"付きのフォルダ情報
    call Get_ins $$info;
    $$TuruKameDir = $$return ;
    //アカウント情報の確認(文字列の確認)
    call Str_check $$TuruKameDir,"鶴亀インストールディレクトリ情報の取得に失
敗しました。\n" + $$info ;

    // DLL を Load する
    loaddll $$TuruKameDir + "tkinfo.dll";
    if( !result ) {
    message "DLLロードに失敗\n"+$$info;
    endmacro;
    }
return ;

//鶴亀インストールディレクトリの取得
//戻り値 最後に"\"付きのフォルダ情報
Get_ins:
$$info = $$1;
    openreg "CURRENTUSER","Software\\Hidemaruo\\TuruKame\\Config";
    if( !result ) {
    message "鶴亀がインストールされてないです (^^;)\n"+$$info;
    closereg ;
    goto LEND;
    }

    $$TuruKameDir = getregstr( "TuruKameDir" );
    closereg ;
return $$TuruKameDir;

Res_check:
//処理:処理の判定&メッセージ表示
    //引数渡し
    ##num = ##1;    $$mes = $$2 ;
    if(##num != 1){
        message $$mes ;
        goto LEND;
    }
return ;

Str_check:
//処理:文字列の判定&メッセージ表示
    //引数渡し
    $$str = $$1;    $$mes = $$2 ;
    if($$str == ""){
        message $$mes ;
        goto LEND;
    }
return ;

//----------------------EXPORT.MAC 終わり ----------------------

[ ]
RE:00236 鶴亀マクロ入門No.00237
ぱと さん 02/11/25 12:42
 
プックン さん

さっそくのコメントどうもありがとうございます。

>// 置換用マクロ
>// REPLACE.MAC
>$1 = "! " ;
>$2 = "." ;
>replaceallfast $1 ,$2 ;
>save ;
>exit;
>// REPLACE.MAC 終わり

>    //メール選択状態
>    ##Select = dllfunc("MailIndex");
>    if(##Select == -1){
>        message "メールが選択されていません" ;
>        goto LEND
>    }
>
>    #n = dllfunc("Export", $TempFile, "turukame", "log");
>
>    run hidemarudir + "\\hidemaru.exe /x" + $mac + " /h " + $TempFile ;

なるほど、いったん、鶴亀の方では標準の Export 機能で書き出しておいてから、
秀丸の方で、! を . に置換するマクロを動かし、TaskPrize 連携用の形に加工す
るということですね。この方法なら、必要な加工処理は、秀丸の方でいかように
でも出来るということですね。

その他の、インストールディレクトリの取得やエラー処理などの部分も参考にな
りました。マクロ初心者だと、こういうお約束の部分になじみがないので、つい、
自分の環境のパスに決め打ちでマクロを書いてしまったりしますので。

どうもありがとうございます。

----
ぱと

[ ]
RE:00233 鶴亀マクロ入門No.00238
ぱと さん 02/11/25 13:50
 
自己コメントです

>複数メールの区切りは、行頭にピリオドだけの行として、複数メールを所定のフ
>ァイルに落とす。(これが、TaskPrize が要求するフォーマットです。)
>
>特定のヘッダの情報及び、ログのファイル名、オフセットを本文の前に一定のフ
>ォーマットで情報を付加してから、上記の処理を行う。

かわしたさん、プックンさんのご教示と、マクロヘルプなどの参照によって、後
者の方の処理は、一応動くようになりました。汚いコードで恐縮なのですが、書
いてみます。

エラー処理などもしていませんし、フォルダも決め打ちですが。

選択したメールをエクスポート用のフォルダにコピーして、メールの先頭に情報
を付加する処理をします。

#このフォルダのメール全てを対象にして処理を繰り返す部分(while の処理)が、
#全然判らなくて、試行錯誤してこうなってますが、どなたか添削していただ
#けるとありがたいです。

ここまで来て判らない部分が、最後の方のフォルダのメール全てを選択する処理
です。

エクスポートの形式は、一応 TaskPrize の方に、mbox 形式でも処理できるよう
にお願いをして見ました。もしこの要望が通れば、鶴亀の側では mbox でexport
すればよいことになります。

loaddll "TKInfo.dll";

#n = dllfunc( "DisableDraw", 1 );

#n = dllfunc( "Copy", "", "受信\\TPZ" );
#n = dllfunc( "SelectFolder",dllfuncstr( "CurrentAccount" ), "受信\\TPZ"
 );
#total = dllfunc("MailCountAll");

while(#total){
if (#total==0) break;
#n = dllfunc("SetMailIndex", #total-1);
#n = dllfunc("BeginEditMail");
#r = readonly;
#b = browsemode;
if(#r) readonlyswitch;
if(#b) browsemodeswitch;
gofiletop;
$MailFileName = dllfuncstr("MailFilePath");
$Date = dllfuncstr( "CurrentHeader", "date" );
$From = dllfuncstr( "CurrentHeader", "From" );
$Subject = dllfuncstr( "CurrentHeader", "Subject" );
$MsgID = dllfuncstr( "CurrentHeader", "Message-ID" );
insert "\n";
insert "==Header Information for TPZ==\n";
insert " |MailFileName:" + $MailFileName + "\n";
insert " |Date        :" + $Date +    "\n";
insert " |From        :" + $From +    "\n";
insert " |Subject     :" + $Subject + "\n";
insert " |Message-ID  :" + $MsgID + "  \n";
insert "==============================\n\n";
#n = dllfunc("SaveEditMail", 0, 1 );
if(#r) readonlyswitch;
if(#b) browsemodeswitch;
#total = #total - 1;
}

#n = dllfunc( "EnableDraw" );

// 全てのメールを選択(?)

// #n = dllfunc("Export", "C:\\export.txt", "mbox", "log");
// run "C:\\Program Files\\TaskPrize2\\TskPrize.exe /ic:\export.txt";

endmacro;

----
ぱと

[ ]
RE:00238 鶴亀マクロ入門No.00239
ぱと さん 02/11/25 15:09
 
自己コメントです

この処理では駄目でした。あらかじめメールを特定のフォルダにコピーしてから、
メールの位置情報を取得するという手順では、当然のことですが、コピーした先
のフォルダに対応する情報しか取得することができません。

コピーする前のフォルダの中で、BeginEditMail して、付加したいヘッダ情報を
つけてから、特定のフォルダにセーブするという手順して、元メールの編集は破
棄するという形でいけるかと思ったのですが、SaveEditMailでは、保存先のフォ
ルダは指定できないようです。

うーむ、難しいですね。

もう一つ根本的な問題なのですが、/vf オプションは、そのメールが入っている
ファイル名と、ファイル内でのオフセット位置を使ってジャンプを行うわけです
が、この仕組み上、メールをフォルダ間で移動したり、フォルダの整理を行って、
ファイル内での位置が変わってしまったら、その時点で、取得されているジャン
プ用の情報は無意味になってしまうということですね。

というわけで、これらのことをクリアするには、Message-Id: を外部から指定し
てのジャンプなどがサポートされなければいけないということになってしまいま
す。

----
ぱと

[ ]
RE:00233 鶴亀マクロ入門No.00240
ぱと さん 02/11/25 16:24
 
自己コメントです。

質問部分が、通常の発言と混ざっていてわかりにくくなっていますので、質問だ
け簡潔に別投稿とさせていただきます。

(1)あるフォルダ内のメールを全て選択する方法はありますか?
(2)あるメールのファイル内の位置(オフセット)を取得する関数はありますか?
(メールのプロパティで保存先に[位置]として表示される数字です)

----
ぱと

[ ]
RE:00233 鶴亀マクロ入門No.00241
ぱと さん 02/11/25 16:36
 
自己コメントです。

ここの会議室は流量が少ないので、勝手な発言をしていてしまいましたが、最初
の頃の投稿に書いてあった会議室の趣旨によれば、主にマクロ作者さんがサポー
ト用に使うための会議室だったのですね。

失礼しました。

マクロ初心者が質問できるような会議室はどこになりますでしょうか?

#というか、私の場合、それ以前の問題で、もう少し勉強してから出直して
#きた方がいいのかもしれませんが・・・

----
ぱと

[ ]
RE:00240 鶴亀マクロ入門No.00242
秀まるお さん 02/11/25 16:38
 
>(1)あるフォルダ内のメールを全て選択する方法はありますか?

 裏技としてはあります。

    #n = dllfunc("SelectPane", 1);
    #n = sendmessage( findwindowclass("TuruKameFrame")
                    , 0x0111, 40008, 0 );

   0x0111  --- WM_COMMAND
   40008   --- 「すべて選択」のコマンドコード


>(2)あるメールのファイル内の位置(オフセット)を取得する関数はありますか?

 ありません。次のバージョンにMailFileOffset関数を追加します。

[ ]
RE:00242 鶴亀マクロ入門No.00243
ぱと さん 02/11/25 16:50
 
秀まるお さん

>>(1)あるフォルダ内のメールを全て選択する方法はありますか?
>
> 裏技としてはあります。
>
>    #n = dllfunc("SelectPane", 1);
>    #n = sendmessage( findwindowclass("TuruKameFrame")
>                    , 0x0111, 40008, 0 );
>
>   0x0111  --- WM_COMMAND
>   40008   --- 「すべて選択」のコマンドコード

裏技のご披露ありがとうございます。もしかして、裏技を使えば、鶴亀で可能な
操作は全てマクロ化可能なのかもしれませんね。

>>(2)あるメールのファイル内の位置(オフセット)を取得する関数はありますか?
>
> ありません。次のバージョンにMailFileOffset関数を追加します。

ありがとうございます。よろしくお願いいたします。

その後、TaskPrize の方に、mbox 形式でのインポートのサポートをお願いしまし
たが、ピリオド区切りに限定しているのは、TaskPrize の方のデータ形式がそう
なっているからであるという回答を頂きました。長い目で見れば、mboxからのイ
ンポート実装の可能性もあるということでしたが、すぐにはできなさそうです。

鶴亀の方の export 形式にピリオド区切り形式をお願いできないかと先に書きま
したが、汎用の処理ではないと思いますので、要望は取り下げます。お騒がせし
ました。

----
ぱと

[ ]
RE:00241 鶴亀マクロ入門No.00244
ひろ さん 02/11/25 17:13
 
 ぱとさん今日は、ひろです。
> マクロ初心者が質問できるような会議室はどこになりますでしょうか?
 秀丸なら、http://www.maruo.co.jp/hidesoft/4/
 鶴亀 (tkinfo.dll 内の関数について) なら、
http://www.maruo.co.jp/turukame/2/ になるでしょう。

[ ]
RE:00244 鶴亀マクロ入門No.00245
ぱと さん 02/11/25 17:27
 
ひろ さん

>> マクロ初心者が質問できるような会議室はどこになりますでしょうか?
> 秀丸なら、http://www.maruo.co.jp/hidesoft/4/
> 鶴亀 (tkinfo.dll 内の関数について) なら、
>http://www.maruo.co.jp/turukame/2/ になるでしょう。

了解しました。んじゃ、一応2番でいいですかね。

実は、私は、鶴亀のみの登録ユーザーなので、マクロを使うにしても、出来る限
り鶴亀のマクロのみで完結させたいのです。しかし、今回のように、メールの内
容を一部書き換えた上で、指定の区切り方に加工して、ファイルとして保存する
というような処理は鶴亀単独では難しいのかもしれませんね。

どうもありがとうございました。

----
ぱと

[ ]
RE:00243 鶴亀マクロ入門No.00246
秀まるお さん 02/11/25 17:35
 
>鶴亀の方の export 形式にピリオド区切り形式をお願いできないかと先に書きま
>したが、汎用の処理ではないと思いますので、要望は取り下げます。

 そういう要望が出てることを見てませんでした。(ここの会議室はあまり見て
ないので)

 別にピリオド区切りでのエクスポートに対応しても悪くは無いんですが、現状
でも、鶴亀メールテキスト形式でエクスポートして、置換を使って処理すること
は可能です。

    #n = dllfunc("NewMail");
    #n = dllfunc("SwitchHeaderView", 0);
    gofiletop;
    beginsel;
    gofileend;
    delete;
    insertfile "...エクスポートしたファイル...";
    gofiletop;
    beginsel;
    down;
    delete;
    gofileend;
    insert "\n.\n";
    gofiletop;
    replaceallfast "^.", "..", regular;
    gofiletop;
    replaceallfast "\x0C! ", ".";
    saveas "...エクスポートしたファイル...";

 みたいな感じで処理できることは出来ます。(上記マクロはまったくテストし
てません)

[ ]
RE:00246 鶴亀マクロ入門No.00247
ぱと さん 02/11/25 17:46
 
秀まるお さん

> そういう要望が出てることを見てませんでした。(ここの会議室はあまり見て
>ないので)
>
> 別にピリオド区切りでのエクスポートに対応しても悪くは無いんですが、現状
>でも、鶴亀メールテキスト形式でエクスポートして、置換を使って処理すること
>は可能です。
>
>    #n = dllfunc("NewMail");
>    #n = dllfunc("SwitchHeaderView", 0);
>    gofiletop;
>    beginsel;
>    gofileend;
>    delete;
>    insertfile "...エクスポートしたファイル...";
>    gofiletop;
>    beginsel;
>    down;
>    delete;
>    gofileend;
>    insert "\n.\n";
>    gofiletop;
>    replaceallfast "^.", "..", regular;
>    gofiletop;
>    replaceallfast "\x0C! ", ".";
>    saveas "...エクスポートしたファイル...";
>
> みたいな感じで処理できることは出来ます。(上記マクロはまったくテストし
>てません)

なるほど、鶴亀のマクロのヒント集に載ってる、テキストファイルの処理ですね。
そうか! いったん Export したものを上記の処理のように、再度読み込んでから、
置換などの処理をすれば、秀丸は必要ないわけですね。目からうろこでした。

>    gofiletop;
>    beginsel;
>    gofileend;
>    delete;

どうしてこのような処理が必要なのかなあと思ったら、署名やら、標準テンプ
レートやらを消すためであるわけですね。

またいろいろと試して見ます。どうもありがとうございました。

#Message-ID による外部ツールからのジャンプも、要望リストに入れておいてい
#ただけるとありがたいです。

----
ぱと

[ ]
RE:00246 鶴亀マクロ入門No.00250
ぱと さん 02/11/27 12:45
 
秀まるお さん

>    replaceallfast "^.", "..", regular;

この部分ですが、これだと、全ての行頭に . が付加されてしまったので、正規表
現について調べて、

replaceallfast "^[\.]", "..", regular;

こうしてみました。これでいいでしょうか?

----
ぱと

[ ]
RE:00250 鶴亀マクロ入門No.00251
秀まるお さん 02/11/27 23:08
 
 すみません。テストしてないでとりあえず「こういう雰囲気で」と書いただけ
なので、間違ってました。

 たしかに正規表現では「.」は特別な意味となってしまうので、「\.」としな
いとダメでした。

[ ]