【マクロ要望】AL-MAIL→秀丸メール アドNo.00366
はじめ さん 06/08/10 22:53
 
Al-Mailと秀丸メールのユーザです
標記マクロ大変助かります
ところで,動作に関して,以下の点が気になります。如何でしょう。

1)Al-Mailのアドレスデータにおける End group 指定が反映されない。
 この点は,アドレス帳の階層構造の設計自体に違いがあるため仕方ないのかも知れ
ませんが,どうにか工夫して対応頂けると助かります。
 具体的には,End group 指定の直後のデータが,直前のGroupに包摂された形で変
換されてしまう。本来であれば,End group 指定の後ですから,そのデータは,そ
の階層のルートに置かれなければならないはずです。Al-Mailでは,End group指定の
ために,かなり柔軟な階層と表示順の構築が可能となっていますが(しかもセパレタ
まである),秀丸メールでは,階層のルートのデータは,サブ階層(さらに深い階層)
フォルダの「前」に置かれる他無い仕様になっている(のですよね?)。
 ですから,End group指定の後に来るデータについては,ファイル上での位置の移
動が必要になるわけです。
 その辺の動作が,ちょっと違うと思いました。

 例:
name0: xxx@add.jp
Group hoge1
    name1: xxx@add.jp
    name2: xxx@add.jp
    name3: xxx@add.jp
End group
name4: xxx@add.jp
Group hoge2
    name5: xxx@add.jp
    name6: xxx@add.jp
End group


(正)
name0: xxx@add.jp
name4: xxx@add.jp
g1
name1: xxx@add.jp
name2: xxx@add.jp
name3: xxx@add.jp
g1
name5: xxx@add.jp
name6: xxx@add.jp


(誤)
name0: xxx@add.jp
g1
name1: xxx@add.jp
name2: xxx@add.jp
name3: xxx@add.jp
name4: xxx@add.jp
g1
name5: xxx@add.jp
name6: xxx@add.jp

2)半角スペースが除去されていない?(実用上支障ないが)
 Al-Mailのアドレスデータで,「:」のあとに「 」(半角スペース)がありますが(見
やすさのための仕様か?),秀丸メールのAl-Mailのアドレスデータで「,」のあとに
「 」(半角スペース)があると,秀丸メールでアドレス指定したとき,「 」(半角ス
ペース)が頭に着いたデータが挿入されちゃいます。
 実用上問題ないのですが,どうしてかな,とおもったので。。

とりあえず,1)について,ご検討頂けると幸いです。

[ ]
RE:00366 【マクロ要望】AL-MAIL→秀丸メNo.00367
はじめ さん 06/08/10 23:01
 
細かいですが訂正と付記

プックンさん作
AL-MAIL→秀丸メール アドレス帳 変換マクロ Ver1.01
についてです。

また,例が不正確でした。
正しくは

 例:
name0: xxx@add.jp
Group hoge1
    name1: xxx@add.jp
    name2: xxx@add.jp
    name3: xxx@add.jp
End group
name4: xxx@add.jp
Group hoge2
    name5: xxx@add.jp
    name6: xxx@add.jp
End group


(正)
name0,xxx@add.jp
name4,xxx@add.jp
g1 hoge1
name1,xxx@add.jp
name2,xxx@add.jp
name3,xxx@add.jp
g1 hoge2
name5,xxx@add.jp
name6,xxx@add.jp


(誤)
name0, xxx@add.jp
g1 hoge1
name1, xxx@add.jp
name2, xxx@add.jp
name3, xxx@add.jp
name4, xxx@add.jp
g1 hoge2
name5, xxx@add.jp
name6, xxx@add.jp

ですね。上記では,半角スペースの部分も再現してみました。

[ ]
RE:00367 【マクロ要望】AL-MAIL→秀丸メNo.00368
はじめ さん 06/08/11 09:27
 
独りで書いているようで申し訳ありません
もう一点,
3)グループ名に宛先として使えない文字が含まれています=()/
 というエラーが出ます。これは秀丸メールのアドレスへのグループ指定の方法の使
用による制約により,=()/の4つのキャラクタが使用できない仕様になっているのだ
とおもいますが,これらの置換操作は入れられるでしょうか。とりあえず,2バイト
の=()/にしてしまうというのが手っ取り早いような気もします。

 自分でマクロ改良できるといいのですが,残念ながら及びません。よろしくお願い
します。


[ ]
RE:00368 【マクロ要望】AL-MAIL→秀丸メNo.00370
プックン さん 06/08/19 01:17
 
はじめ さん、こんばんわ。

感想、ご指摘ありがとうございます。

マクロの動作を確認しました。
>1)Al-Mailのアドレスデータにおける End group 指定が反映されない。
1)についてですが、現在のマクロの処理では簡単に修正できません。
例で示していただいた
>name0: xxx@add.jp
>Group hoge1
>    name1: xxx@add.jp
>    name2: xxx@add.jp
>    name3: xxx@add.jp
>End group
>name4: xxx@add.jp
name0,name4をひとつのグループにまとめるためには、
グループごとにデータを保存しておいて、グループが終了したことを
認識してから変換データを出力するような処理が必要になります。
いまのマクロは、データの順番は変更するような仕組みがありません。
時間をみつけて、できるかどうか検討してみます。

>2)半角スペースが除去されていない?(実用上支障ないが)
>3)グループ名に宛先として使えない文字が含まれています=()/
2),3)については、マクロを修正しました。

マクロをライブラリにアップロードしておきますので、また試して見てください。


[ ]
RE:00370 【マクロ要望】AL-MAIL→秀丸メNo.00371
はじめ さん 06/08/22 00:37
 
早速のご対応ありがとうございます
>>1)Al-Mailのアドレスデータにおける End group 指定が反映されない。
>1)についてですが、現在のマクロの処理では簡単に修正できません。

>時間をみつけて、できるかどうか検討してみます。

よろしくお願いします。
事実上この部分の処理が自力では出来ずに困っているところだったんです。

手作業で
End group後にエントリしているアドレスを,
一旦,グループ名定義の直後に異動しておいて,
マクロに流し込めばいいのでしょうが,
間違いをおかさないで手作業を行う自身がありません。
気付かないうちに,違うエントリを抱えたグループ宛にメールを出して
しまわないとも限りません。ですので,ちょっと慎重に。

ロジックは上述の通り,

あるグループ内でのエントリの入れ替え操作について;
グループにもしサブグループがあった場合,
サブグループのEnd group後にエントリしている
当該グループ階層のアドレス(行)を,
当該グループ名定義の直後に異動する

でいいのかな,ともおもいましたが,よく考えると,
これはちょっと良くないですね。
Al-Mail側にデータを戻すとき上手くいきません。

そこで,思いついたのが,新たなサブグループを作成するという手法。

当該グループ名をhoge1とした場合,
新たなサブグループとして,hoge1_sub1,hoge1_sub2・・・
というように,マクロ規定値(_sub[番号]のような)の文字列を
グループ名に追加したサブグループ名を生成して,
そこに,入れる

という方法です。
これなら,順番を入れ替えずに済みそうです。

かつこれなら,セパレタにも対応する余地があります。
セパレタ以後に現れたエントリを,
hoge1_sep1などの新たなサブグループに入れちゃうという方法です。

この規定値部分に変更を加えない限り,
#かつ,規定値部分と重なる文字列を規定値部分以外で使って居なければ
秀丸からAl-Mailへのデータの変換も可能となると思います。
如何でしょう。

グループの階層レベル値(?)については,
マクロ内で処理されているのですよね。
つまり,End Groupを拾って値に変更は加えている。
となれば,サブグループが終わって階層が一段上(下?)に異動した際,
即ち,End Groupを拾った直後の動作として,
グループの階層レベル値を-1した後,
 次の行が,アドレス情報ならば,新たなサブグループを作成する,
  次にグループ名もしくはEnd Groupが出現するまで
  そのサブグループは閉じない(それまでのエントリを
  そのサブグループに納める)
 次の行が,グループ名ならば,従来通りの動作をする,
次の行が,End Groupならば,従来通りの動作をする,
という分岐操作を設けるだけでいけそうです。

 例:
name0: xxx@add.jp
Group hoge1
    name1: xxx@add.jp
    name2: xxx@add.jp
    name3: xxx@add.jp
End group
name4: xxx@add.jp
Group hoge2
    name5: xxx@add.jp
    Group hogehoge21
        name6: xxx@add.jp
    End group
    name7: xxx@add.jp
End group
name8: xxx@add.jp


(従来の動作〜はこうですよね?)
g1 Address
name0,xxx@add.jp
g2 hoge1
name1,xxx@add.jp
name2,xxx@add.jp
name3,xxx@add.jp
name4,xxx@add.jp
g2 hoge2
name5,xxx@add.jp
g3 hogehoge21
name6,xxx@add.jp
name7,xxx@add.jp
name8,xxx@add.jp


(期待される動作)
g1 Address
name0,xxx@add.jp
g2 hoge1
name1,xxx@add.jp
name2,xxx@add.jp
name3,xxx@add.jp
g2 Address_sub1
name4,xxx@add.jp
g2 hoge2
name5,xxx@add.jp
g3 hogehoge21
name6,xxx@add.jp
g3 hoge2_sub1
name7,xxx@add.jp
g2 Address_sub2
name8,xxx@add.jp

動作の基本理念。
1)当該グループに入っていないアドレスエントリは
  当該グループには入れない
2)当該グループに入っているアドレスエントリは
  当該グループに入れる
3)新規のグループを作成しても上記1)2)に矛盾しない
  すなわち,新規サブグループに編入されても,
  当該グループ下に入っていることには違いがないので
補足:3)の原理を使うと,セパレタの処理も可能。
     ちょっと面倒そうですが。。

>>2)半角スペースが除去されていない?(実用上支障ないが)
>>3)グループ名に宛先として使えない文字が含まれています=()/
>2),3)については、マクロを修正しました。

ありがとうございました。後で試してみます。

[ ]
RE:00371 【マクロ要望】AL-MAIL→秀丸メNo.00372
はじめ さん 06/08/22 12:57
 
使ってみました。
また,マクロも少し追っかけてみました。
#沢山時間がかかってしまいましたが。。(^^;
さまざまな条件でも設計通りに動くマクロを書くってすごく大変なんですね。
まだまだ理解できないところが多いですが,ユーザとして出来ることをしていきたい
と思います。

1)$$date について
さっそく,細かいことですが,
$$date = "2005/10/13";

$$date = "2006/08/19";
でしょうか。

2)例の検討事項への対応について
グループ名の処理の部分がずいぶんと複雑になっていますね。とても私には作れそう
にありません。

ところで,マクロに沢山コメント行を加えて下さったので,何の作業をしているのか
分かりやすくなりました。私なりに処理を追ってみたのですが,Group とEnd Group
の処理のイメージがちょっと違いましたね。なんとスマートなことに,一挙に両方を
検索して処理して居るんですね。これは定石なのかも知れませんが,とても勉強にな
ります。
さて,そうなると,どうなるのか,ちょっと考えてみました。
#既に,プックンさんはこれくらいのレベルまでは解決済みかもしれませんが。

End Group|Groupを検索
 if 検索結果がEnd Group
 then グループの階層レベル値を-1
    次の行の検査
    if その行が,アドレス情報
    then 新たなサブグループを作成する
       #この処理だと,
       #マクロ全体を通じて通し番号にするしかないですかね
    else 何もしない
       #あるいはカーソル位置を元の行に戻す必要が
       #あるのかも知れませんね
 else グループがヒットしたと解釈してグループ名の処理を行う
    グループの階層レベル値を+1

アドレス行かどうかの検査ですが,理論上は,
 Group [グループ名]
 End Group
 アドレスエントリ
 セパレタ
 EOF
の5種類ですね。

やはり次の行にカーソルを移動して,1行範囲選択をして,
「:」が含まれているかどうかで判定しましょうか。
ただこの場合,
セパレタの後にアドレスエントリが来る可能性がありますので,
先にセパレタを削除しておく方が良いかもしれません。

変換イメージはこんな感じでしょうか。
#新規作成のサブグループ名(予約語みたいになるのかな?)
 を通し番号で生成していく感じです。
##そういえば同じグループ名があった場合秀丸メールが
  どういう動作になるのかわかりませんが,
  多分何か,問題が生じる虞がありますよね。
  その辺のチェックも必要なのかしら?

 例:
name0: xxx@add.jp
Group hoge1
    name1: xxx@add.jp
    name2: xxx@add.jp
    name3: xxx@add.jp
End group
name4: xxx@add.jp
Group hoge2
    name5: xxx@add.jp
    Group hogehoge21
        name6: xxx@add.jp
    End group
    name7: xxx@add.jp
End group
name8: xxx@add.jp


(期待される動作)
g1 Address
name0,xxx@add.jp
g2 hoge1
name1,xxx@add.jp
name2,xxx@add.jp
name3,xxx@add.jp
g2 Virtual Group 1
name4,xxx@add.jp
g2 hoge2
name5,xxx@add.jp
g3 hogehoge21
name6,xxx@add.jp
g3 Virtual Group 2
name7,xxx@add.jp
g2 Virtual Group 3
name8,xxx@add.jp

動作の基本理念。
(1)当該グループに入っていないアドレスエントリは
  当該グループには入れない
(2)当該グループに入っているアドレスエントリは
  当該グループに入れる
(3)新規のグループ(仮想グループ)を作成しても
  上記(1)(2)に矛盾しない
  すなわち,新規サブグループに編入されても,
  当該グループ下に入っていることには違いがないので
(4)同じグループ名があってはならないので,
  ありそうもないグループ名にすること,
  そして,全体で通し番号をつけること
  たとえば,「"Virtual Group"+通し番号」みたいな

3)階層レベル値のエラー処理について
あと,私の勘違いかも知れませんが。
 while( 1 ) {
  //"End group" or "Group "を検索する。
のループの中では,
グループの階層レベル値は,かならず2以上となるような仕様
#Addressというルート階層がG1をとっているので
だと思うので,階層レベルは2未満の値を取れば,異常な気がします。
現在の警告処理が,0未満の場合となっていたので,気になりました。
マクロの読み間違いでしたらご無礼をお許し下さい。

4)0文字以上であるかどうかを確認することについて
それから,こちらもおこたえ頂けなくても構いませんが,
  //文字列長が1以上の場合
  if(##diff_x > 0) {
ですが,これは,elseによる警告処理がありませんが,
なにかの定石処理なのでしょうか。
上記処理と何か関連があるのかと思い少し気になりました。

5)カンマ処理その1
最後に,先ほど気付いたのですが,自組織のメールサーバを持っている人は,もしか
すると,アドレスを@より前の部分だけしか登録していない場合もあるかな,と思う
のですが,そのような場合で,アドレスエントリにおいて複数アドレスが一つの見出
しに並記されている場合(たとえば“name1: add1, add2”)は,変換が上手くいきま
せん。これは,仕様として良いような気がしますが,明記しておいた方がいいかも知
れませんね。

6)カンマ処理その2
それから,アドレスエントリの見出しに", "があるばあい(たとえば,“Sirname, F
irstname: xxx@add.jp”),これも変換が上手くいきません。しかしこちらは,改善
の余地があるかも知れません。とくに,英文字で氏・名を表記していらっしゃる方は
特に欧米のかたには多いので,そういう方から頂いたメールをそのまま登録している
と,こういう形式になっていることが多いです。こっちは,ちょっと重要でしたね。
最後になってしまいました。

最後の2点は,マクロのどこがどうしてこうなってしまうのか,理解できておりませ
ん。

以上 宜しくご検討下さい。

ps

7)同じグループ名があった場合の問題について(未確認)
##同じグループ名があった場合秀丸メールが
  どういう動作になるのかわかりませんが,
  多分何か,問題が生じる虞がありますよね。
  その辺のチェックも必要なのかしら?

[ ]
RE:00372 【マクロ要望】AL-MAIL→秀丸メNo.00373
プックン さん 06/08/26 00:50
 
はじめ さん、こんばんわ。

いろいろな案を検討していただいたようですが、とりあえず
最初に提示していただいた例とほぼ同じ結果になるように作りました。

またライブラリに登録しておきますのでお試しください。
>例:
>name0: xxx@add.jp
>Group hoge1
>    name1: xxx@add.jp
>    name2: xxx@add.jp
>    name3: xxx@add.jp
>End group
>name4: xxx@add.jp
>Group hoge2
>    name5: xxx@add.jp
>    name6: xxx@add.jp
>End group
>
>↓
>(正)
>name0,xxx@add.jp
>name4,xxx@add.jp
>g1 hoge1
>name1,xxx@add.jp
>name2,xxx@add.jp
>name3,xxx@add.jp
>g1 hoge2
>name5,xxx@add.jp
>name6,xxx@add.jp

3)階層レベル値のエラー処理について
グループ数のチェックは、"Group "と"End Group"の個数が同じで
あるかどうかをチェックしてるぐらいです。"現在の警告処理が,0未満"と
書き込んでいる処理がどれを示しているのか理解できませんでした。
 //"Group"と"End group"の個数を比較し、同じであるか確認する。
 if(##cnt_group != ##cnt_endgroup){

4)0文字以上であるかどうかを確認することについて
"文字列長が1以上の場合"と判別してますが、まったく意味の無いことを
してました。
検索文字列が存在なければ判定式の前でbreakしてるので、必ずTrueに
なる条件式をいれてました。


7)同じグループ名があった場合の問題について(未確認)
同じグループが存在していてもエラーが発生したことないです。
とりあえず、マクロとしては同じグループ名があった場合は、
同じ階層に存在しているのと同じ処理になって、アドレス情報を移動します。
アドレス情報を移動した後は、グループ情報だけ残るので、そのグループ
情報を削除するようにしておきました。

[ ]
RE:00373 【マクロ要望】AL-MAIL→秀丸メNo.00374
はじめ さん 06/08/26 17:07
 
早速ご対応頂きありがとうございます。
たぶんこれで,安心して旧資産のAddressファイルの情報を使えることと
おもいます。

>またライブラリに登録しておきますのでお試しください。
時間のあるときに試してみます。

>3)階層レベル値のエラー処理について
>グループ数のチェックは、"Group "と"End Group"の個数が同じで
>あるかどうかをチェックしてるぐらいです。"現在の警告処理が,0未満"と
>書き込んでいる処理がどれを示しているのか理解できませんでした。
> //"Group"と"End group"の個数を比較し、同じであるか確認する。
> if(##cnt_group != ##cnt_endgroup){

 if(##level < 0){
 message "Level Error\n" + $info ;
 goto LEND ;

のことです。何か私の勘違いかも知れません。

[ ]
RE:00374 【マクロ要望】AL-MAIL→秀丸メNo.00375
プックン さん 06/08/27 09:42
 
はじめさん、こんにちは。

3)階層レベル値のエラー処理について

理解できました。
本マクロとして、
階層レベルは、秀丸メールのアドレス帳を最上位階層をG1(##level=1)として処理さ
せています。
このエラー処理は、"Group"と"End Group"の階層構造が異常の場合、を判定していま
す。ファイルの上側から処理を実施して"Group"の出現個数より"End group"の個数が
上回った場合、階層がおかしいと判断しています。
そのための処理です。

 if(##level < 0){
ではなく
 if(##level < 1){
が正しいですね。

階層
hoge1
+----hoge2
+--------hoge3

Group hoge1 ##level=1
End group
End group ##level=-1 こんな場合をエラーと判別
Group hoge2  ##level=2
  Group hoge3  ##level3
  End group
End group

+--hoge1  ##level=1
hoge2     ##level=0
+--hoge3  ##level=1

"Group ","End group"の個数チェックについての処理かと思っていましたが
階層レベルのことでしたね。質問の内容を誤解していました。


[ ]
RE:00375 【マクロ要望】AL-MAIL→秀丸メNo.00377
はじめ さん 06/09/18 12:05
 
プックンさん 大改造でしたね。
ようやっと時間が出来たのでダウンロードしにやってきました。
反応が遅く大変申し訳ありません。
早速あとで,動作確認してみます。

>3)階層レベル値のエラー処理について
>
>理解できました。
>本マクロとして、
>階層レベルは、秀丸メールのアドレス帳を最上位階層をG1(##level=1)として処理さ
>せています。
>このエラー処理は、"Group"と"End Group"の階層構造が異常の場合、を判定してい
>ます。ファイルの上側から処理を実施して"Group"の出現個数より"End group"の個
>数が上回った場合、階層がおかしいと判断しています。
>そのための処理です。
>
> if(##level < 0){
>ではなく
> if(##level < 1){
>が正しいですね。
>
>階層
>hoge1
>+----hoge2
>+--------hoge3

実は,

3)階層レベル値のエラー処理について
あと,私の勘違いかも知れませんが。
 while( 1 ) {
  //"End group" or "Group "を検索する。
のループの中では,
グループの階層レベル値は,かならず2以上となるような仕様
#Addressというルート階層がG1をとっているので
だと思うので,階層レベルは2未満の値を取れば,異常な気がします。
現在の警告処理が,0未満の場合となっていたので,気になりました。
マクロの読み間違いでしたらご無礼をお許し下さい。

と書きましたが,
新しいマクロでは,AddressではなくTopとなっていますが,
これが,G1の階層をとります。
#私の理解では,アドレスブックの使用上ルート(G0?)があります。
 が,そのことは,あまり重要ではないかも知れません。
 あえて,ルート(G0)階層を使わずに変換するのは,何かの利用価値が
 あるかもしれませんし。。
 それはさておき,

このG1階層は,上述

 while( 1 ) {
  //"End group" or "Group "を検索する。
のループ

の外で処理されていました。
そして,
 ##level = ##init_level + 1 ;
のあとに,このループが始まりますので,
変数 ##level の初期値は,
このループ内では2から始まり,
グループがあった場合+1されて(最初のグループとの遭遇で3になり)
グループ終端の情報で−1されます。
ですので,適正に処理されても最低値が2。
エラー処理の場所が,−1操作のあとですから,
たとえば,初っぱなにグループ終端情報を拾っちゃった(不正な情報)場合
##level値は1になりますが,この時点でエラーと解釈すべきでしょう。
という理解でした。
如何でしょう。

[ ]
RE:00373 【マクロ要望】AL-MAIL→秀丸メNo.00378
はじめ さん 06/09/27 14:59
 
プックンさん 使用レポートです
今のところ気付いた点は以下の通りです

6)カンマ処理その2
それから,アドレスエントリの見出しに", "があるばあい(たとえば,“Sirname, F
irstname: xxx@add.jp”)
について。あと一歩改訂が必要なようです。

どうやら秀丸メールアドレス帳では、
「名前」データにカンマなど、
#どうやら、,.;:<>()[]の10種類の文字列
が含まれているときはデータを""で囲む仕様に
なっているようで、秀丸メール自体も
その前提で動作しているようです。
#必ずしも完全にその前提というわけでもなく、
 時折気まぐれにAdrBookデータにない""を着けてくれたり
 することもあるのでどうも一筋縄ではいかない気配ですが。
 しかし、以下のようにすれば問題なくなるかと。
そこで、この変換マクロでも、上記の文字列が含まれた
「名前」データに関しては、""で囲む変換を施すように
したら如何でしょう。
すくなくとも、,を含むデータについては、そのように
変更できるようでしたらお願いします。
宛先入力の設定で「名前」+「アドレス」にしている場合、
あるいは、入力補完で「名前」が入力されちゃった場合に、
誤動作しますので。
よろしく、ご検討下さい。


[ ]
RE:00378 【マクロ要望】AL-MAIL→秀丸メNo.00379
プックン さん 06/09/29 01:48
 
はじめ さん、こんばんわ

>3)階層レベル値のエラー処理について
>あと,私の勘違いかも知れませんが。
> while( 1 ) {
>  //"End group" or "Group "を検索する。
>のループの中では,
>グループの階層レベル値は,かならず2以上となるような仕様
>#Addressというルート階層がG1をとっているので
>だと思うので,階層レベルは2未満の値を取れば,異常な気がします。

Ver 1.02のマクロでは、確かに常時2以上になっていますね。
2未満の値を取れば,エラーとするべきですね。
ご指摘ありがとうございます。

>#私の理解では,アドレスブックの使用上ルート(G0?)があります。
> が,そのことは,あまり重要ではないかも知れません。
> あえて,ルート(G0)階層を使わずに変換するのは,何かの利用価値が
> あるかもしれませんし。。
> それはさておき,
外部アドレスとして利用するときに、G0のグループがあった場合に
変になる場合があるので、G1をルートとして作成しています。

>#どうやら、,.;:<>()[]の10種類の文字列
>が含まれているときはデータを""で囲む仕様に
>なっているようで、秀丸メール自体も
上記10種類の文字を含む名前の場合は、""でくくるように修正しました。
次の版数 1.04で修正しておきます。
またアップロードしたら試してみてください。


[ ]