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 として開きます。
ソースが表示されます。
TaskID がタスクリストの GUID です。
この GUID を、新しいリストの GUID に書換えます。
ワークフロー内でタスクの割り当てを行っていない場合は、TaskID は無視して構いません。
変更を保存してからワークフローを編集すると。
判りづらいですが、適用先が WFtestList2 → WFtestList3 になったのが確認できます。
元のリストと、新しいリストが同じ列名(厳密には同じ内部名)を持っていれば、ワークフローの各アクションはきちんと維持されてます
しかし、実はこれだけではまだ不十分です。
ワークフロー内で、「ワークフロー参照」が利用されていた場合、参照先は、まだ以前のリストを指したままになっています。
そこで、今度は hogehog.xmol を、XML として開いて編集します。
非常に込入った構造になっていますが、よく見ると、この中に、以前のリストの GUID が含まれて居ます。そこで、その値を、新しい GUID に全て置換します。(編集→置換を使うと楽です)
置換ができたら、保存して閉じます。
ワークフロー参照の先も、変更されました。
これで変更は完了です。
しかし、実はまだ、このワークフローを実行することは出来ません。
ワークフローはリストを認識しましたが、リストがワークフローを認識していないためです。
そこで、今度は普通にワークフローを編集モードで開き、何も変更せずに [完了] します。
これで、本当に完了です。
新しいリストにアイテムを投入し、ワークフローが正しく動くことを確認して下さい。
ちなみに hogehoge.xoml.wfconfig.xml に設定されている 内の BaseID と DocLibID にも GUID が指定されています。
変更しなくても、ワークフローの動作そのものには影響ないようですが、それではちょっと気持ちが悪いので調べてみました。
DocLibID は、ワークフローが保存されている Workflows の GUID です。
Workflows の実態はドキュメントライブラリなんですね。
ただし、この GUID は、前述の方法では取得することができません。
この辺りのツールが必要になります。
(便利なのでインストールしておいて損はありません)
これまで試した範囲では、この値が間違っていても問題なく動作していますが、念のため取得して正しく書換えておいた方が良いでしょう。
一方、BaseID についてはあまり情報が無く、確実なことが言えないのですが…
調べてみた限り、これはワークフロー自身を示す GUID のようです。
ワークフローを作成した時点で(最初の展開時)、Designer が自動的に一意の文字列を生成しているものだと思われます。
同じサイトに同じ設計のワークフローをいくつも作成してみましたが、それぞれ全く関連性の無い、異なった GUID が付与されました。
マイクロソフトのドキュメントによると
BaseID :A GUID uniquely identifying the workflow template that this workflow association is based upon.
となっています。
当初はこれを「ワークフローが基づいているワークフローンプレート」と解釈して「?」だったのですが、どうも workflow は Designer で作成したワークフロー自体を指し、workflow association はその構成ファイルという意味にもとれます。
用途としては、外部アプリケーションからワークフローを起動させる際に指定するような感じでしょうか?
とすれば、これも一意にしておいた方が良いですね。
ダミーのワークフローを作成して GUID を生成させ、その GUID に書換えてから、ダミーを削除すれば良いと思われます。
次回は、サイトを跨いだワークフローの移動について書く予定です。
Why Can’t I Easily Port SharePoint Designer Workflow Solutions From One List to Another? Part 1
Why Can’t I Easily Port SharePoint Designer Workflow Solutions From One List to Another? Part 2
SharePoint Manager 2007
login