SharePoint Designer で作成したワークフローをサイト内の別リストにコピーする

SharePoint Designner で作成されたワークフローは、最初の発行時に特定のリスト(またはライブラリ)に紐付けられます。この設定は、後から変更することはできず、このため、同じ設定のワークフローを、他のリストで流用することが出来ません。

SharePoint Designer 上で Workflow フォルダを開きコピー→貼付けすれば、ワークフローそのものは複製することが出来ます。

しかし、このコピーされたワークフローを編集しても、もとのリストに紐付いたままです。
別リストを指定することができません。

この問題を解決するには、ワークフローの設定ファイルを直接編集する必要があります。


まず、作業をはじめるにあたり、現在のリストと、新しい適用先リストの GUID が必要です。
リストの GUID を知る方法はいろいろありますが、最も簡単な方法は、リストの設定画面を開くことです。
設定画面の URL の、List= 以下が GUID です。

例:http://server/site/_layouts/listedit.aspx?List=%7BECFFE187%2DA1F7%2D4D2C%2D8947%2D2B79238224C0%7D

ただし、この URL は UTF-16(たぶん)でエンコードされていますので、デコードする必要があります。
とは言っても別に難しくは無く、以下の置換を行うだけです。

%7B → {
%7D → }
%2D → -

ですが、都度、三回置換を行うのも面倒ですので、私はエクセルでマクロを組んでいます。
まあマクロというのも恥ずかしいような代物ですけど…。
よろしければご利用ください。
sharepointGUIDdecode.xls

で、この置換を行うと、上記の場合なら、GUID は
{ECFFE187-A1F7-4D2C-8947-2B79238224C0}
になります。

次に、SharePoint Designer で Workflow >(ワークフロー名)> を開きます。

hogehoge.xoml.wfconfig.xml を右クリックして、XML として開きます。

ソースが表示されます。

内の ListID が現在関連付けられているリストの GUID。
TaskID がタスクリストの GUID です。

この GUID を、新しいリストの GUID に書換えます。
ワークフロー内でタスクの割り当てを行っていない場合は、TaskID は無視して構いません。

変更を保存してからワークフローを編集すると。

判りづらいですが、適用先が WFtestList2 → WFtestList3 になったのが確認できます。
元のリストと、新しいリストが同じ列名(厳密には同じ内部名)を持っていれば、ワークフローの各アクションはきちんと維持されてます

しかし、実はこれだけではまだ不十分です。
ワークフロー内で、「ワークフロー参照」が利用されていた場合、参照先は、まだ以前のリストを指したままになっています。

そこで、今度は hogehog.xmol を、XML として開いて編集します。

非常に込入った構造になっていますが、よく見ると、この中に、以前のリストの GUID が含まれて居ます。そこで、その値を、新しい GUID に全て置換します。(編集→置換を使うと楽です)
置換ができたら、保存して閉じます。

ワークフロー参照の先も、変更されました。

これで変更は完了です。
しかし、実はまだ、このワークフローを実行することは出来ません。

ワークフローはリストを認識しましたが、リストがワークフローを認識していないためです。
そこで、今度は普通にワークフローを編集モードで開き、何も変更せずに [完了] します。

これで、本当に完了です。
新しいリストにアイテムを投入し、ワークフローが正しく動くことを確認して下さい。

ちなみに hogehoge.xoml.wfconfig.xml に設定されている