フォルダ監視での自動処理を行う設定について、基本的な概念や作り方を紹介します。
また、eDocArrangementの設定方法は、製品のヘルプや以下のオンラインヘルプに詳しく記載してます。
また、製品Webサイトにも設定例等を紹介してます。
eDocArrangementの設定画面では、設定を複数作成できます。
一つの設定は、フォルダ監視を行った結果のファイルリストを対象に繰り返し処理を行います。 設定内の各処理は、ファイル一つに対して順番に実行されます。
設定が複数ある場合、監視間隔が全て同じ場合は、設定一覧の上から順に処理が行われます。
また、設定で作成した処理はDocuWorksDeskのプラグインからも実行可能です。DocuWorksDeskのプラグインから実行した場合は、選択した文書に対して、繰り返し処理を行います。
設定画面の文字を入力できる項目のほとんどで、マクロを使用できます。入力欄で右クリックメニューを表示した際に、マクロ書式のメニューが表示される場合は、マクロが使用できます。
また、処理の追加でマクロ実行を追加すると、マクロを実行するためのパネルが追加されます。マクロ実行では、プログラムに近い処理が記述可能です。ページ毎に繰り返し実行することもできます。
マクロには、以下の様な種類があります。
eDocArrangementが処理中に取得したファイル名や、ファイル内のテキストやアノテーションの情報を保持するデータ参照系のマクロ。
文字列操作や四則演算、ファイルの読み書き等を行う実行系のマクロ。
DocuWorksAPIを使ったDocuWorks文書の編集を行うマクロ。
マクロは「{%NAME(引数1,引数2)}」のような書式で記述します。呼び出したいマクロに、パラーメターとしての引数を指定すると、処理を行い、マクロ文が戻り値の文字に置き換わります。
例えば、日付を取得する以下のマクロは、システム日付を取得し、年月日に置換されます。
{%DATE(yyyy/mm/dd)}
置換後
2019/07/01
文書移動において、移動先フォルダにDATEマクロを使った場合は、名前に日付の入ったフォルダが作成されます。
マクロで作り出されたパスのフォルダが存在しない場合は、文書移動の機能で自動作成されます。
C:\test\{%DATE(yyyy)}
フォルダを作成
c:\test\2019
上記のDATEマクロのようにマクロが値を返す場合は、マクロ文が戻り値の文字に置き換わりますが、値を返さないマクロもあります。
ログファイルに文字を出力する「{%LOG_OUT()}」は、ログに文字が出力されるだけで、戻り値はありません。戻り値を返さないマクロは、マクロ実行の画面で使用します。
{%LOG_OUT(ファイル名:{%FILE_NAME})}
処理中のファイル名が「Test.xdw」の場合、ログファイルに「ファイル名:Test.xdw」が出力されます。
マクロを使えば、ファイル名やフォルダ名の文字列加工や、XDW文書の文書属性の取得・設定、アノテーション貼り付けなど、様々な処理が可能です。
eDocArrangementに実装されているマクロとその使い方を調べるには、以下のオンラインマニュアルを参照してください。
上記のページの右上にある検索欄から、調べたいキーワードを入力すると候補が表示されます。例えば、QRコードに関するマクロは「QR」と入力するだけで候補が表示されます。
eDocArrangementの設定画面から「マクロ実行」処理を追加できます。
「マクロ実行」ではマクロ文を自由に記述できます。実行時に1ファイル毎に記述したマクロ文が実行されます。(「マクロをページ単位で処理する」をチェックするとページ毎に処理が実行されます。)
例えば、以下のマクロを記述すると、
{%SET_U(属性,処理年月日,{%DATE(yyyy/mm/dd)})} {%DW_SET_USER_ATTRIBUTE(処理年月日,{%GET_U(属性,処理年月日)})} {%LOG_OUT(処理年月日:{%GET_U(属性,処理年月日)})}
処理実行時に、以下の処理が実行されます。
グローバルデータは、設定内で繰り返し使う文字を変数に定義したものです。
例えば、監視フォルダや処理済みフォルダなどのパスを記述する場合に、同じ文字(パス)を何度も設定画面に入力することになります。例えば、以下のような名前でパスを定義します。
TopFolder C:\Home\受発注業務
上記のような定義をグローバルデータで定義しておくと、「{%GET_G(TopFolder)}」とマクロを記述するとことで、「C:\Home\受発注業務」が展開されるようになります。
{%GET_G(TopFolder)}\入力
上記のような記述をすると、「C:\Home\受発注業務\入力」と入力したのと同じになります。
このようにグローバルデータを使うと、後から変更する場合もグローバルデータの定義を変更するだけで、全ての設定値を変更したことと同じになり、効率的です。
設定画面では、ユーザーデータ関連のマクロを使って、情報(テキスト)を保持できます。ユーザーデータは一般的なプログラム言語の変数にあたります。名前を2つ(eDocArrangementでは「データ名」「キー」としています)指定して、一つの「値」を記憶できます。ユーザーデータは基本的に、ファイルの繰り返し処理の中で、ファイル単位で値を保持します。(設定で監視処理単位の保持に変更することも可能)
例えば、ファイル名「A001_20190925.xdw」のように、先頭に識別番号(A001)が付与されている場合、先頭の4文字をユーザーデータ(データ名:属性,キー:識別番号)に記憶しておくには、マクロ実行処理を追加して、以下の様なマクロを記述します。(LEFTマクロで先頭4文字をとってA001を取得)
{%SET_U(属性,識別番号,{%LEFT({%BASE_FILE_NAME},4)})}
このマクロを記述したマクロ実行処理のあとでは、以下のようなユーザーデータ取得マクロでいつでも識別番号を参照できるようになります。
{%GET_U(属性,識別番号)}
マクロには文字列操作系のマクロを多数用意しています。例えば、ファイル名が「AB0001.xdw」の様に先頭2桁が分類を表す文字の場合に、分類毎のフォルダを作成するために、ファイル名の先頭2桁を文書移動のフォルダに指定したい場合は、以下の様なマクロを文書移動処理の移動先フォルダに記述します。
D:\業務\保管\{%LEFT({%FILE_NAME},2)}
上記の記述で、「AB0001.xdw」を処理した場合に「D:\業務\保管\AB」フォルダが自動で作成され移動されます。(文書移動の処理では、移動先のフォルダがなければ自動で作成されます。)
上記のマクロは{%FILE_NAME}が「AB0001.xdw」となり、「{%LEFT(AB0001.xdw,2)}」になり、LEFTマクロにより先頭2文字が取得され、結果的に「AB」となります。
ファイル名が「20191002_伊藤_請求書.xdw」のような場合に、文字列分割マクロを使うと、指定した区切り文字(この例の場合はアンダーバー)で分割することが可能です。
以下のマクロでファイル名を_で分割して、分割後の文字をユーザーデータにセットします。
{%SPLIT({%BASE_FILE_NAME},_,分割文字)} {%SET_U(属性,年月日,{%GET_U(分割文字,1)})} {%SET_U(属性,担当者名,{%GET_U(分割文字,2)})} {%SET_U(属性,帳票名,{%GET_U(分割文字,3)})}
「20191002_伊藤_請求書.xdw」を処理した場合、文書移動の移動先フォルダに以下のように記述すると、
D:\業務\保管\{%GET_U(属性,年月日)}\{%GET_U(属性,帳票名)}\{%GET_U(属性,担当者名)}
以下の様なフォルダが作成されます。
D:\業務\保管\20191002\請求書\伊藤
ファイル名が「20191002_伊藤_請求書.xdw」のような場合に、末尾から_までの文字(請求書)を取得したい場合、前述した文字列分割マクロを使うこともできますが、正規表現文字列抽出マクロを使用して取得することもできます。
以下のマクロで、拡張子を除いたファイル名の末尾から_までの文字を取得して、ユーザーデータにセットします。
{%SET_U(属性,年月日,{%REGEX_CAPTURE(_(.+?)$,{%BASE_FILE_NAME})})}
「{%BASE_FILE_NAME}」は拡張子を除いたファイル名を取得するマクロなので、「20191002_伊藤_請求書」となります。その文字を末尾から_までを取得するので「請求書」がユーザーデータにセットされます。
eDocArrangementはフォルダ監視で動作するので、無人で処理が行われます。そのため、どのような処理をいつ行ったかを記録するログを残すことが重要となります。
設定毎にログの出力設定が可能です。フォルダ監視を行う場合は、必ずログの設定を行ってください。
eDocArrangementは、マクロを使ってプログラミングのような処理が可能なので、エラー処理についても、柔軟な対応が可能です。
マクロを使ってエラー処理を書かなくても、最低限のエラー処理は標準の機能で行われますが、エラーログが出力されるため、事前に想定できるエラーはマクロで判定して、エラーログが出力されないようにすることを推奨します。
例えば、ファイル名が「20191002_伊藤_請求書.xdw」のようなファイルを処理する場合に、文字列分割マクロを使って、3つの項目に分割し、それぞれのデータをフォルダ名やファイル名に使用する設定を作成したとします。
この場合のエラーの想定としては、「ファイル名がどのように作成されるか?」ということに注目します。
ファイル名を人が入力する場合は、エラーを想定する必要があります。人はミスをする可能性があるからです。
この場合、ファイル名を_で分割した結果の個数が3つであるかチェックをします。3つ以外ならば、ファイルは処理せず、文書移動でエラーフォルダに移動するようにします。
ファイルが他のシステム(プログラム)によって付与される場合はどうでしょう?
その場合も、付与するプログラムがどこからその情報を取得しているかによってエラー処理が必要か決まります。そのプログラムが、必ず3つの項目をファイル名に付与するのであれば、エラー処理は必要ないと思います。ですが、そうでない場合は、分割後の個数をチェックするべきです。
eDocArrangementは、ファイルを扱う処理が多いので、特にファイルのエラー処理を考える必要があります。そのためには、ファイルの性質を知る必要があります。
ファイルはプログラムによって、オープン、読み書き、クローズという手順で情報を読み取る仕組みになっています。
プログラムでファイルを更新する場合は、ファイルのオープン時に排他オープンという、他のプログラムがファイルを開けない状態でオープンを行います。
排他オープンされたファイルは、クローズされるまで、他のプログラムからオープンすることができなくなります。
eDocArrangementでも、排他オープンされているファイルは開けずエラーになりますが、ウイルスチェックプログラムなどがオープンするケース等を想定して、オープンエラーになった場合はリトライを行うように対策しています。そのため瞬間的な排他オープンであればリトライで成功します。
ですが、ユーザーが対象ファイルを開いているような場合は、長時間ファイルがクローズされることはないため、リトライしてもファイルをオープンすることができずエラーとなります。
そのため、処理するファイルが他のプログラムやユーザーの操作によってオープンされる可能性があるかどうかを考えて、処理を作成する必要があります。
例えば、共有フォルダにあるバインダファイルに処理中のXDW文書を挿入する場合を考えます。バインダファイルはユーザーが開いている可能性があるので、その時に処理が動くとエラーとなります。
その場合の対処方法として、バインダファイルを共有フォルダから、ローカルフォルダに移動してから、文書の挿入を行い、また共有フォルダに戻す等の方法が考えられます。オープンされている場合は、移動もできないためエラーになりますが、監視の処理が繰り返されクローズされたときには成功します。移動ができたあとは、ユーザーや他のプログラムにオープンされる心配はなくなりますので、文書の挿入や属性付与などを安全に行うことができます。
このような処理も、できるだけ複雑なエラーを発生させないための工夫ですが、ファイルの性質を知ることで対象方法を考えることができるようになると思います。
ファイルの同時オープンが考えられる場合は、設計の段階でユーザー様に処理エラーの発生リスクを説明して、できるだけ、そのような処理を避けるような設計をすることも有効です。
eDocArrangementでは、アノテーション読み取り、OCR読み取り、正規表現文字列抽出マクロで正規表現を使用できます。
正規表現は鬼車ライブラリを使用しており、Rubyの1.9系列やPHPの5系列と同等の表現が使用できます。
よく使う正規表現の記号の意味は以下の通りです。
正規表現 | 意味 |
---|---|
. | 改行(Lf(0A))以外の文字。WindowsOSは改行がCrLf(0D0A)なので注意が必要。 |
+ | 直前の文字の1文字以上の繰り返し。 |
* | 直前の文字の0文字以上の繰り返し。 |
() | 括弧の中をキャプチャ(取得)する。 |
^ | 文字の先頭。 |
$ | 文字の末尾。 |
? | 最短部分。(左から右に見た場合の最短) |
\d | 数字。 |
\t | タブ記号。 |
[] | []内の何れかの文字。例 [A-Z]でA~Zの文字の何れか。 |
[^] | [^]内の何れかの文字以外。例 [^\t]でタブ以外。 |
正規表現の詳細な仕様は、書籍やネットの記事などから調べて頂くのが良いと思いますが、ここでは、eDocArrangementでよく使う正規表現をいくつか紹介いたします。
eDocArrangementでは、REGEX_CAPTUREマクロで正規表現が使用できます。アノテーション読み取り、OCR読み取りで使用する正規表現では、取得する文字の実装が異なりますので、以下にマクロで使用する場合と、アノテーション読み取りで使用する場合の例を記載します。
REGEX_CAPTUREマクロでは、正規表現中に必ず()を1組だけ記述する仕様となっています。また、()内の文字をREGEX_CAPTUREマクロの戻り値として返す仕様となっています。
ファイル名が「A001-01.xdw」の場合、拡張子を除いたファイル名の先頭からハイフンまでの文字を取得して、ユーザーデータ(属性,番号)にセットする。
{%SET_U(属性,番号,{%REGEX_CAPTURE(^([^-]+)-,{%BASE_FILE_NAME})})}
上記マクロ実行後は、「{%GET_U(属性,番号)}」が「A001」となります。
上記のマクロでは、正規表現の分が「^([^-]+)-」となっています。「
[^-]」がハイフン以外という意味で、「[^-]+」がハイフン以外の1文字以上の繰り返しという意味になります。先頭の「^」は「先頭」という意味なので、「^[^-]+」は先頭からハイフン以外の1文字以上の繰り返しという意味になります。
「()」は括弧内の文字を取得する意味なので、ハイフン以外の文字が取得されます。末尾にハイフンを記述するとハイフンを見つけるまでが正規表現となりますので、ハイフンが見つからない場合は結果としてマッチせず、何も取得されません。
正規表現を「^([^-]+)-」のように末尾にハイフンを記述しているので、ファイル名にハイフンが含まれないとマッチせず、空文字が返却されます。
「^([^-]+)」と記述すれば、ハイフンがない場合は、先頭から末尾までの文字を取得して返却されるようになります。
どちらが良いかは、その後の処理で取得した文字をどう扱うかによります。ハイフンがない場合はエラーにしたい場合は、ハイフンも含めた正規表現にして、空文字が返却された場合は、IFマクロで判定してエラー処理を行うことになります。
ファイル名が「A001-01.xdw」の場合、拡張子を除いたファイル名の末尾からハイフンまでの文字を取得して、ユーザーデータ(属性,枝番)にセットする。
{%SET_U(属性,枝番,{%REGEX_CAPTURE(-([^-]+)$,{%BASE_FILE_NAME})})}
上記マクロ実行後は、「{%GET_U(属性,枝番)}」が「01」となります。
「担当:伊藤」のようなテキストアノテーションから、「伊藤」部分を取得したい場合は、以下の正規表現をアノテーション読み取りの正規表現欄に入力します。(アノテーション読み取りの正規表現欄は、正規表現の前後に/を記述します。)
/担当:([^\t]+)/
アノテーション読み取りの連結文字をタブにした場合、アノテーションが複数ある場合はタブ区切りになるので、「[^\t]」でタブ以外という表現にします。アノテーションが一つなら末尾にタブはありませんが、タブ以外なので末尾までの文字を取得します。