添付ファイルを編集して返信No.49799
GARI2 さん 16/05/10 12:52
 
こんにちは。

いつも便利につかっています。

返信メールにおける、添付ファイルの扱いについて相談させてください。仕事のメー
ルを処理していると、このようなケースがよくあります。
 ・添付されているファイル(エクセルやワードなど)に、
 ・コメントや検印、追記などを行い、
 ・メール返信の際、更新したファイルも添付し、送信

ワークフローやファイル共有サーバなどを利用するのが本筋だとは思いますが、相手
先の環境にもよりますし、まだまだ添付ファイルを活用している客先も多くあります。

こういった処理の場合に「添付ファイルを開いて編集し保存する」作業を行うと、殆
どのアプリではデフォルト保存場所が受信メールフォルダになってしまう(後からエ
クスプローラで探すのが困難)ため、

 ・保存先フォルダをデスクトップなどに変更して、
 ・一旦デスクトップに保存し、
 ・メール返信の際にドラッグ&ドロップで添付し、
 ・メール送信後、デスクトップのファイルを削除
  (必要であればしかるべきフォルダに保存しますが、
   「メールに添付されている」状態であれば後から参照しやすい
   ので、デスクトップに保存したものは消します)

という面倒な手順が発生します。

マクロなどで、何とか便利に使えるような方法は無いものでしょうか?例えば、「添
付ファイルを開いて返信」のようなボタンがあると、「返信エディタを開く」「添付
ファイルを開く(保存先が、自動的に返信メールへの添付ファイルとなる)」という
様な機能があると、ボタンを押すだけで
 ・返信メールの編集
 ・返信添付ファイルの編集
が一度に出来るのですが、、、(この案も、添付ファイルが複数あるとどう実現すれ
ば良いのか??)


[ ]
RE:49799 添付ファイルを編集して返信No.49800
秀まるお2 さん 16/05/10 14:23
 
マクロで良ければということで、作ってみました。添付ファイルが1つの時はいきな
りそれを対象に実行し、2つ以上ならメニューで選択する形になります。

デスクトップに一時的に保存してファイルを開き、編集が終わったらOKボタンを押し
てもらうことで、元のファイルを置き換えて、デスクトップのファイルは削除します。


-----------------------------------------------------------
    loaddll "tkinfo.dll";
    #count = dllfunc("CountCurrentHeader", "X-Attach");
    #index = 0;
    if( #count == 0 ) {
        message "添付ファイルはありません。";
        endmacro;
    }
    if( #count > 1 ) {
        #i = 0;
        $menu[0] = "編集する添付ファイルを選択してください。";
        $menu[1] = "\x01";
        while( #i < #count ) {
            $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
            $attach = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
            $menu[2 + #i] = $attach;
            #i = #i + 1;
        }
        menuarray $menu, #count + 2;
        if( result <= 2 ) {
            endmacro;
        }
        #index = result - 3;
    }
    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #index);
    $attachbase = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
    $path = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + $a
ttach;

    $desktop = getenv("USERPROFILE") + "\\Desktop";
    if( !existfile($desktop) ) {
        message "デスクトップフォルダが特定できませんでした。";
        endmacro;
    }
    $destdir = $desktop;
    $destpath = $destdir + "\\" + $attachbase;
    #n =dllfunc("Bypass_CopyFile", $path, $destpath, 1);
    if( #n == 0 ) {
        message "添付ファイルをデスクトップの一時編集用フォルダにコピーする
のが失敗しました。";
        endmacro;
    }
    openbyshell $destpath;
    if( result != yes ) {
        message "添付ファイルをデスクトップの一時編集用フォルダに保存しまし
たが、ファイルを開くことに失敗しました。";
        endmacro;
    }
    message "ファイルを開きました。編集が終わったらOKボタンを押してください。";
    #n = dllfunc("Bypass_CopyFile", $destpath, $path, 0);
    if( #n == 0 ) {
        message "添付ファイルをデスクトップの一時編集用フォルダから戻す用の
コピーに失敗しました。";
        endmacro;
    }
    #n = dllfunc("Bypass_DeleteFile", $destpath);
    message "編集した添付ファイルで置き換えました。";

[ ]
RE:49800 添付ファイルを編集して返信No.49820
GARI2 さん 16/05/12 09:35
 
素晴らしい提案、有難うございます。

処理を実施してみたところ、下記の部分で躓いているようです。
Bypass関数などで対応は可能でしょうか?


1) 添付ファイルをデスクトップへコピーする際、読み取り専用になってしまう。そ
のため、ファイルを編集しようとしても「名前を付けて保存」の別名保存になってし
まい、$destpath が変わってしまう。


2) 元添付ファイルと同ファイル名にしていても、送信添付フォルダに戻す
 dllfunc("Bypass_CopyFile", $destpath, $path, 0);
の処理で失敗する。アカウントの「送信添付」フォルダを確認しても、このdll実行
時点ではフォルダが作成されていないため保存に失敗しているように見えます。



[ ]
RE:49820 添付ファイルを編集して返信No.49822
秀まるお2 さん 16/05/12 10:10
 
> 1) 添付ファイルをデスクトップへコピーする際、読み取り専用になってしまう。そ
> のため、ファイルを編集しようとしても「名前を付けて保存」の別名保存になってし
> まい、$destpath が変わってしまう。

 ファイルの属性が読み取り専用のケースは考えてませんでした。

 tkinfo.dllにBypass_GetFileAttributes/Bypass_SetFileAttributes関数も用
意されてるので、それでコントロールするようにしてみます。

> 2) 元添付ファイルと同ファイル名にしていても、送信添付フォルダに戻す
>  dllfunc("Bypass_CopyFile", $destpath, $path, 0);
> の処理で失敗する。アカウントの「送信添付」フォルダを確認しても、このdll実行
> 時点ではフォルダが作成されていないため保存に失敗しているように見えます。

 フォルダが無いはずは無いような気がします。(元々そこからデスクトップに
コピーしてるはずだし)

 エラーメッセージの中でエラーコードやファイルのパス名すべてなども詳しく
表示するようにしてみます。

 少々お待ちください。

[ ]
RE:49822 添付ファイルを編集して返信No.49823
GARI2 さん 16/05/12 10:18
 

> フォルダが無いはずは無いような気がします。(元々そこからデスクトップに
>コピーしてるはずだし)

検討有難うございます。
そもそも、
 @「受信添付」フォルダから持ってきて、そこに保存しなおされる
 A返信メール作成の際、「送信添付」フォルダが新たに作られる
という流れだったのでしょうか(私は、送信添付フォルダの有無を見ていました…)

受信したメールの添付ファイルそのものが書き換わってしまう、
と言うのは出来れば避けたいと思っていますので、
 @「受信添付」フォルダから持ってくる。また、「送信添付」フォルダも新た作ら
れる。
 A編集した添付ファイルは、「送信添付」フォルダ側に保存される。
という流れが良いのかな、と思っていました。

[ ]
RE:49823 添付ファイルを編集して返信No.49824
秀まるお2 さん 16/05/12 10:32
 
> そもそも、
>  @「受信添付」フォルダから持ってきて、そこに保存しなおされる
>  A返信メール作成の際、「送信添付」フォルダが新たに作られる
> という流れだったのでしょうか(私は、送信添付フォルダの有無を見ていました…)

 そもそも的にマクロの使い方として僕が思っていたのは、

 1.返信メールや新規メールで送信用のウィンドウを起動する。
 2.送信する用の添付ファイルを添付する。
 3.その添付ファイルを編集したいと思ってマクロを実行する。

 という感じでいました。

 そういう前提だと、ファイルが読み取り専用属性になってることは普通無いと
思って属性をいじる処理は入れてませんでした。

 読み取り専用属性になるってことは、受信系メールの添付ファイルを書き換え
ようとしてるのかなぁと思ったのですか、そういうご要望でも無いのですね。

>  @「受信添付」フォルダから持ってくる。また、「送信添付」フォルダも新た作ら
> れる。
>  A編集した添付ファイルは、「送信添付」フォルダ側に保存される。
> という流れが良いのかな、と思っていました。

 単純にマクロの作業としては、

 1.返信しようとしてるメールを選択して、マクロ実行する。
 2.現在選択してるメールの添付ファイルをデスクトップにコピーして
   開く。(ファイルの読み取り専用属性も解除する)

 ってだけで良くて、あと、そのファイルを添付した返信メールの作成などはご
自身で手作業でやっていただいた方がいいのやら?

 何かこの辺の期待するシナリオなど教えていただければ、それ用にマクロを直
せると思います。

[ ]
RE:49824 添付ファイルを編集して返信No.49825
GARI2 さん 16/05/12 11:15
 
ご返信有難うございます。

> 読み取り専用属性になるってことは、受信系メールの添付ファイルを書き換え
>ようとしてるのかなぁと思ったのですか、そういうご要望でも無いのですね。

いえ、記載の通りの要望となります。想定されるシーンとして、
 @相手先から、添付付きメールが送られてくる。
 Aこの添付ファイルを編集し、追記したり、電子印を押したりする。
 B編集した添付ファイルを、送り返す。
と言ったシーンを想定しています(実際に、とても多いです)
少し違うのは、「受信メールの添付ファイルそのものを書き換える」のではなく「受
信メールの添付ファイルを編集し、返信する(でも、元ファイルは書き換えない)」で
す。

> 単純にマクロの作業としては、
>
> 1.返信しようとしてるメールを選択して、マクロ実行する。
> 2.現在選択してるメールの添付ファイルをデスクトップにコピーして
>   開く。(ファイルの読み取り専用属性も解除する)
>
> ってだけで良くて、あと、そのファイルを添付した返信メールの作成などはご
>自身で手作業でやっていただいた方がいいのやら?

シンプルなものとしては、デスクトップに保存する、、だけで良さそうですね。送信
添付に保存しデスクトップに作成したものは消したい、との処理まで要望させて頂い
た理由は、
 (1) (個人的な理由ですが)デスクトップに色んなファイルが散らばっているため、
パッと見てどれが作成されたファイルかすぐに分からない
 (2) 「一時的に作成したファイルを削除する」と言うアクションを自動化したい
と言うのが主な理由でした。

ですが、今回のマクロ一時保存先を、デスクトップではなく特別なフォルダ(Desktop
\HMtemp\ 等)にしておき、そのフォルダは定期的にクリーンするようにしておけば、
問題無さそうに思えてきました。


[ ]
RE:49825 添付ファイルを編集して返信No.49826
秀まるお2 さん 16/05/12 13:53
 
 とりあえず、届いたメールを選択して実行する用のマクロということで作ってみま
した。

 マクロのやってることは、

 1.「返信メール」を実行しつつ、その返信メールに返信元メールの
   添付ファイルをそのまま添付する。
 2.その添付ファイルをデスクトップ上の「HMTemp」フォルダにコピー
   して開く。
 3.OKボタンを押したら、編集したファイルを添付しなおす。

 ってな具合です。

--------マクロ開始------------------------------------------------
    loaddll "tkinfo.dll";
    #n = dllfunc("MakeReplyCustom", "", "CopyAttach");
    if( #n == 0 ) {
        endmacro;
    }

    #count = dllfunc("CountCurrentHeader", "X-Attach");
    if( #count == 0 ) {
        endmacro;
    }
    #index = 0;
    if( #count > 1 ) {
        #i = 0;
        $menu[0] = "編集する添付ファイルを選択してください。";
        $menu[1] = "\x01";
        while( #i < #count ) {
            $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
            $attach = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
            $menu[2 + #i] = $attach;
            #i = #i + 1;
        }
        menuarray $menu, #count + 2;
        if( result <= 2 ) {
            endmacro;
        }
        #index = result - 3;
    }
    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #index);
    $attachbase = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
    $path = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + $a
ttach;

    $desktop = getenv("USERPROFILE") + "\\Desktop";
    if( !existfile($desktop) ) {
        message "デスクトップフォルダが特定できませんでした。";
        endmacro;
    }
    $destdir = $desktop + "\\HMtemp";
    #n = dllfunc("Bypass_CreateDirectory", $destdir);
    $destpath = $destdir + "\\" + $attachbase;
    #n = dllfunc("Bypass_CopyFile", $path, $destpath, 0);
    if( #n == 0 ) {
        #code = dllfunc("Bypass_GetLastError");
        message "添付ファイルをデスクトップの一時編集用フォルダにコピーする
のが失敗しました。\n"
              + "コピー元ファイル = " + $path + "\n"
              + "コピー先ファイル = " + $destpath + "\n"
              + "エラーコード = " + str(#code);
        endmacro;
    }
    #attr = dllfunc("Bypass_GetFileAttributes", $destpath);
    if( (#attr & 1) != 0 ) {
        #n = dllfunc("Bypass_SetFileAttributes", $destpath, #attr & 0xFFFE);
    }
    openbyshell $destpath;
    if( result != yes ) {
        message "添付ファイルをデスクトップの一時編集用フォルダに保存しまし
たが、ファイルを開くことに失敗しました。";
        endmacro;
    }
    message "ファイルを開きました。編集が終わったらOKボタンを押してください。";
    #n = dllfunc("Bypass_CopyFile", $destpath, $path, 0);
    if( #n == 0 ) {
 
        #code = dllfunc("Bypass_GetLastError");
        message "添付ファイルをデスクトップの一時編集用フォルダから戻す用の
コピーに失敗しました。\n"
              + "コピー元ファイル = " + $destpath + "\n"
              + "コピー先ファイル = " + $path + "\n"
              + "エラーコード = " + str(#code);
        endmacro;
    }
    #n = dllfunc("Bypass_DeleteFile", $destpath);
    #n = dllfunc("Bypass_RemoveDirectory", $destdir);
    message "編集した添付ファイルで置き換えました。";
--------マクロ終了------------------------------------------------


> シンプルなものとしては、デスクトップに保存する、、だけで良さそうですね。

 デスクトップの「HMTemp」フォルダに保存して開くだけ、のマクロも一応作ってみ
ました。


--------マクロ開始------------------------------------------------
    #count = dllfunc("CountCurrentHeader", "X-Attach");
    if( #count == 0 ) {
        endmacro;
    }
    #index = 0;
    if( #count > 1 ) {
        #i = 0;
        $menu[0] = "編集する添付ファイルを選択してください。";
        $menu[1] = "\x01";
        while( #i < #count ) {
            $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
            $attach = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
            $menu[2 + #i] = $attach;
            #i = #i + 1;
        }
        menuarray $menu, #count + 2;
        if( result <= 2 ) {
            endmacro;
        }
        #index = result - 3;
    }
    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #index);
    $attachbase = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
    $path = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + $a
ttach;

    $desktop = getenv("USERPROFILE") + "\\Desktop";
    if( !existfile($desktop) ) {
        message "デスクトップフォルダが特定できませんでした。";
        endmacro;
    }
    $destdir = $desktop + "\\HMtemp";
    #n = dllfunc("Bypass_CreateDirectory", $destdir);
    $destpath = $destdir + "\\" + $attachbase;
    #n = dllfunc("Bypass_CopyFile", $path, $destpath, 0);
    if( #n == 0 ) {
        #code = dllfunc("Bypass_GetLastError");
        message "添付ファイルをデスクトップの一時編集用フォルダにコピーする
のが失敗しました。\n"
              + "コピー元ファイル = " + $path + "\n"
              + "コピー先ファイル = " + $destpath + "\n"
              + "エラーコード = " + str(#code);
        endmacro;
    }
    #attr = dllfunc("Bypass_GetFileAttributes", $destpath);
    if( (#attr & 1) != 0 ) {
        #n = dllfunc("Bypass_SetFileAttributes", $destpath, #attr & 0xFFFE);
    }
    openbyshell $destpath;
--------マクロ終了------------------------------------------------

[ ]
RE:49826 添付ファイルを編集して返信No.49827
GARI2 さん 16/05/12 14:27
 
ほぼ、要望通りの動作になりました!
マクロを実行した際、返信メールウィンドウが開きますが
ここの「添付ファイルも送り返す」にチェックする必要がありますね。

#普段返信の際には添付ファイルは送り返さないため、
#デフォルトはoffの方が都合がよいので、このまま。。

マクロの勉強にもなりました。
有難うございました!


[ ]
RE:49827 添付ファイルを編集して返信No.49831
秀まるお2 さん 16/05/12 15:35
 
> ほぼ、要望通りの動作になりました!
> マクロを実行した際、返信メールウィンドウが開きますが
> ここの「添付ファイルも送り返す」にチェックする必要がありますね。

 マクロの先頭の方にあるMakeReplyCustom文にて添付ファイルを送り返し指定
をしてるはずなんですが、オプションOFFで出てくるとしたら、秀丸メールの
バグかもしれません。調べてみます。

 マクロを手直しするといいかもしれません。

    #n = dllfunc("MakeReplyCustom", "", "CopyAttach");

 の所を、たとえば

    #n = dllfunc("MakeReplyCustom", "All", "CopyAttach");

 とすると、「全員へ返信」となりまして、いちいち問い合わせは出なくなりま
す。

 差出人にのみなら、

    #n = dllfunc("MakeReplyCustom", "Single", "CopyAttach");

 になります。「ヘルプ - 秀丸メール・マクロヘルプ」の中のMakeReplyCustom
文の所も参考になります。

[ ]
RE:49831 添付ファイルを編集して返信No.49833
秀まるお2 さん 16/05/12 16:00
 
 MakeReplyCustom文のパラメータに"CopyAttach"を指定してても返信宛先ダイ
アログボックスの「添付ファイルも送り返す」がONになってくれないのは、調べ
てみたらバグでした。次のVersion 6.54β8にて修正させていただきます。

 とりあえずは、MakeReplyCustomの第1パラメータの方に"All"か"Single"を指
定して問い合わせダイアログを出さなくする作戦で回避お願いしたいです。

[ ]
RE:49833 添付ファイルを編集して返信No.49857
GARI2 さん 16/05/16 15:27
 
> とりあえずは、MakeReplyCustomの第1パラメータの方に"All"か"Single"を指
>定して問い合わせダイアログを出さなくする作戦で回避お願いしたいです。

詳細部分のご確認、お手数おかけしました。
ご指定の対応で使ってみたいと思います。
有難うございました。


[ ]
RE:49857 添付ファイルを編集して返信No.49858
秀まるお2 さん 16/05/16 17:27
 
 先ほどVersion 6.54β8をアップロードしまして、それにて、MakeReplyCustom
のバグ修正をしています。

 (ちょっとアップロードするのが遅くなってしまいました)

 もしよかったらこっちに入れ替えお願いします。

[ ]