サンドボックス ソリューションの変換ガイダンス - InfoPathSandbox solution transformation guidance - InfoPath

分離コードを含む InfoPath フォームを使用している場合、その InfoPath フォームは分離コードを実行するためにコードベースのサンドボックス ソリューションに依存します。この記事では、サンドボックス ソリューションの依存関係がなくなるように InfoPath フォームを修正または変換する方法について説明します。When you're using InfoPath forms with code-behind then these InfoPath forms do depend on code-based sandbox solutions for executing the code-behind. This article will help you to either fix or transform your InfoPath forms so that there's no sandbox solution dependency anymore.

適用対象: SharePoint Online の InfoPath フォーム | SharePoint 2013 | SharePoint 2016Applies to: InfoPath forms for SharePoint Online | SharePoint 2013 | SharePoint 2016

コードベースのサンドボックス ソリューションは、2014 年以降非推奨になっています。また、SharePoint Online では、この機能を完全に削除するためのプロセスが始まっています。コードベースのサンドボックス ソリューションは、SharePoint 2013 および SharePoint 2016 でも非推奨になっています。Code-based sandbox solutions were deprecated back in 2014 and SharePoint online has started the process to completely remove this capability. Code-based sandbox solutions are also deprecated in SharePoint 2013 and in SharePoint 2016.

InfoPath フォームを分析して可能な場合は修正するAnalyze and if possible fix your InfoPath forms

このセクションでは、InfoPath フォームに適用できる分析および修正モデルを示します。In this section we show you an analysis and fixing model that you can apply to your InfoPath forms. フォームによっては、単にフォームを修正するだけで再展開できるものもありますが、InfoPath からの移行が必要になるものもあります。その場合は、必要とされる機能を実現するための代替方法を使用することになります。Depending on your form you can simply fix the form and redeploy it or you need to move away from InfoPath and use an alternative approach to realize the needed functionality. ただし、そうした対策を講じる前に、フォームのビジネス ニーズを評価することが重要です。ビジネスには不要になった大量の古いフォームを見かけることがよくあります。このような場合は、簡単にフォームを破棄できます。However before taking those actions it's important to assess the business need for your form: we often see a lot of old forms which are not business relevant anymore and in those cases it's easier to simply drop the form.

コードビハインド付きの InfoPath フォームを有しているかどうかを見分ける方法How do I know that I've InfoPath forms with code behind?

推奨されるオプションは、SharePoint のサンドボックス ソリューションのスキャナー ツール を使用する方法です。このツールのレポートに、サンドボックス ソリューションが InfoPath ファイルから来ているかどうかが明示されます。The recommended option is to use the SharePoint SandBox Solution scanner tool as the report from this tool will indicate if the sandbox solution is coming from an InfoPath file. さらにこのツールは、ソリューションで使用したアセンブリが、この記事で後ほど説明する「不要」な状態かどうかについても示します。Additionally the tool will also tell you if the used assembly in the solution is "useless" as described later on in this article.

フォームは現在でも有用かAre my forms still relevant?

修復/変換作業に取り組む前に、「このフォームは、現在もビジネスに不可欠であるか」と問いかけることが重要です。Before diving into the remediation/transformation work it's important to ask the question: is this form still critical for my business. そのとおり不可欠であれば、次の章に進んでください。そうではない場合、このフォームを使用して作成されるデータについて考える必要はありません。If so then please continue to the next chapter, if not you need to think about the data created using this form. 一般に、データは InfoPath XML ファイルとして作成されます。このファイルは、SharePoint リスト内に存在します。Typically the data was created as InfoPath XML files which live in a SharePoint list. フォームを削除すると、データを視覚化できなくなります。フォームとデータが不要になっているため、これが問題にならないこともありますが、InfoPath XML ファイルを SharePoint リスト (アイテム) データに変換するためにデータにアクセスできるようにしたいこともあります。If you remove the form you'll not be able to visualize the data anymore: sometimes that's fine since form and data are not relevant anymore but in case you want to ensure access to the data you can convert the InfoPath XML files to SharePoint list (items) data. PnP - 変換リポジトリには、これを実現する方法を示すサンプルがありますThe PnP-Transformation repository contains a sample showing how you can achieve this.

調査のために InfoPath フォーム (XSN ファイル) をダウンロードするDownloading the InfoPath form (XSN file) for inspection

前のセクションの手順では、作業が必要な InfoPath フォームがあることを確認しました。このセクションでは、作業が必要なフォームをダウンロードする方法について説明します。In the section step you've confirmed that you have InfoPath forms that require work, in this section you'll learn how to download these forms. 分離コードを使用した InfoPath フォームは、「フォーム ライブラリ」または「サイト コンテンツ タイプ」のどちらかとして展開されています。InfoPath forms with code behind are either deployed as "Form Library" or as "Site Content Type". 選択した発行モデルに応じて、次に示すようにフォームをダウンロードできます。Depending on the chosen publishing model you can download the forms as follows.

「フォーム ライブラリ」として展開された InfoPath フォームのダウンロードDownload "Form Library" deployed InfoPath forms

この場合、XSN ファイルは、InfoPath フォームの展開先にしたフォーム ライブラリの [Forms] フォルダーにあります。In this case the XSN file is inside the Forms folder of the form library to which the InfoPath form was deployed. WSP パッケージの名前は "InfoPath Form_ライブラリ名id" という規則に従っているため、その名前を調べることで目的のフォーム ライブラリがわかります。To know the form library you can take a look at the WSP package name as if follows this convention: "InfoPath FormLibName_id". 目的のライブラリがわかったら、そのライブラリの [Forms] フォルダーから template.xsn ファイルをダウンロードする必要がありますSo once you have the library you need to download the template.xsn file from the Forms folder of the library. そうするために、ライブラリの URL + "Forms/template.xsn" という URL (この例では、https://contoso.sharepoint.com/sites/infopath1/IHaveCodeBehind/Forms/template.xsn) を作成します。ブラウザーを使用して、この URL からファイルをダウンロードします。You can do so by constructing an url like this: library url + "Forms/template.xsn" like shown in this sample https://contoso.sharepoint.com/sites/infopath1/IHaveCodeBehind/Forms/template.xsn and using the browser to download the file.

「サイト コンテンツ タイプ」として展開された InfoPath フォームのダウンロードDownload "Site Content Type" deployed InfoPath forms

コンテンツ タイプとして展開された InfoPath フォームは、それぞれにフォーム ライブラリに保存された XSN ファイルがあります。このフォーム ライブラリは、フォームの展開時にコンテンツ タイプに結び付けられています。InfoPath forms deployed as content type do have their XSN file stored in a form library which was connected to the content type as form deployment time. 前述のセクションと同様に、WSP パッケージの名前からライブラリの名前がわかります。Like in the previous section you can obtain the library name from the WSP package name. 前述の場合と異なり、このフォームは探し当てたライブラリに実際にファイルとして保存されています。そのため、そのフォームを目的のフォーム ライブラリから単にダウンロードするだけで済みます。What's different this time is that the form is actually stored as a file in the found library, so you can simply download it from the form library.

InfoPath フォームの修正Fixing your InfoPath forms

前述のセクションでは、分離コードを使用した InfoPath フォームを示して取得しましたが、そのフォームには本当に有用な分離コードが含まれているのでしょうか。Previous sections have shown and given you the InfoPath forms with code behind but do they really contain useful code behind? フォームの作成者が、InfoPath の [開発者] リボンにある [コード エディター] ボタンを誤ってクリックしてしまったフォームが多数あることがわかっています。What we see is that there's quite a lot of forms for which the form author accidentally clicked on the Code Editor button in the Developer ribbon of InfoPath:

InfoPath の分離コード

このようにすると、何も実行しない分離コードが含まれてしまいます。この分離コードを削除することで、分離コードを使用した InfoPath フォームを通常の InfoPath フォーム (分離コードを使用しないフォーム) に変換できます。これにより、サンドボックス ソリューションの依存関係がなくなります。Once you've done this you'll have code behind...but this code behind is not doing anything and by removing it you can convert your InfoPath form with code behind to a regular InfoPath form which has no code behind and as such no dependency on sandbox solutions!

分離コードが「不要」なことを調べる方法How do I know the code behind is "useless"?

SharePoint のサンドボックス ソリューションのスキャナーで、InfoPath に不要なコードがあるかどうかがわかりますが、さらに詳細を確認するには、続きをお読みください。The SharePoint Sandbox Solution scanner will tell you if your InfoPath has useless code, but if you want to learn more then continue reading. 不要な分離コードの修正のみが可能なときに、分離コードが不要か必要か、どのように見分ければよいでしょうか。You might wonder how to distinguish between useless and needed code behind as you can only fix the first category. 展開済みのフォームのオリジナル (前述の手順でダウンロードしたフォームではないもの) が残っている場合は、コードを見るだけでわかります。If you still have the original deployed form (so not the one you've downloaded in previous steps) you can simply have a peek at the code. 次に示すコードは、既定の空のコードです。これと同様のコードがある場合は、そのコードを削除することでフォームを修正できます。The default empty code is shown below and if you've similar code then this form can be fixed by dropping the code:

using Microsoft.Office.InfoPath;
using System;
using System.Xml;
using System.Xml.XPath;

namespace Form1
{
    public partial class FormCode
    {
        // Member variables are not supported in browser-enabled forms.
        // Instead, write and read these values from the FormState
        // dictionary using code such as the following:
        //
        // private object _memberVariable
        // {
        //     get
        //     {
        //         return FormState["_memberVariable"];
        //     }
        //     set
        //     {
        //         FormState["_memberVariable"] = value;
        //     }
        // }

        // NOTE: The following procedure is required by Microsoft InfoPath.
        // It can be modified using Microsoft InfoPath.
        public void InternalStartup()
        {
        }
    }
}

前述の手順でダウンロードした XSN ファイルのみがある場合は、XSN ファイルの名前を cab ファイル (たとえば、template.cab) に変更し、アセンブリを抽出し、.Net のリフレクション ツール (たとえば、オープン ソースの ILSpy) を使用してコードを調べます。In case you only have the XSN file which you've downloaded in the previous step you can rename your XSN file to a cab file (e.g. template.cab), extract the assembly and use .Net reflection tools (like the open source ILSpy) to inspect the code. 一般に、ILSpy では、不要な分離コードは次のように表示されます。A typical view of useless code behind looks like this in ILSpy:

ILSpy に表示された不要な分離コード

InfoPath フォームから分離コードを削除して修正するDropping code behind from InfoPath forms to fix them

分離コードが不要であることを確認したら、次の手順を実行することで簡単に分離コードを削除できます。If you've confirmed your code behind is useless you can easily drop it by:

  • [InfoPath Designer] でフォームを開きます (右クリックして、[デザイン] を選択します)Opening up the form in InfoPath designer (right-click - Design)
  • [フォームのオプション] に移動します ([ファイル] > [情報])Go to Form Options via File - Info
  • [プログラミング] カテゴリを選択して、[コードの削除] をクリックします。Select the Programming category and click on Remove Code
  • フォームを再発行します ([ファイル] > [情報] > [クイック発行])Publish the form again via File - Info - Quick Publish
  • リンクされたサンドボックス ソリューションを非アクティブ化します ([サイト設定] > [ソリューション])Deactivate the linked sandbox solution via Site Settings - Solutions
  • フォームが正常に動作することを確認しますConfirm the form works as expected
  • サンドボックス ソリューションを削除しますDelete the sandbox solution

InfoPath XSN ファイルとソース コードへのアクセスがもうできなくなっている場合は、「不要」なコードだけを持つサンドボックス ソリューションを非アクティブ化しさえすればフォームを修正できますIf you don't have access to the InfoPath XSN file and source code anymore you can still fix these forms by simply deactivating the sandbox solutions that have "useless" code only. サンドボックス ソリューションのレポート出力で IsEmptyInfoPathAssembly = true と記載されているフォームに対してのみ、この方法を行ってください。Only do this for the ones mentioned in the sandbox solution report output with IsEmptyInfoPathAssembly = true.

InfoPath フォームの移行Migrate your InfoPath forms

前の章で示したガイダンスが適用できない InfoPath フォームがある場合、そのフォームは現在もビジネスに有用であり、削除できない分離コードを含んでいることを意味します。 If the guidance in the previous chapter was not applicable for your InfoPath form it essentially means your form is still business relevant and contains code behind that you cannot drop. その場合の一般的な解決策は、InfoPath からの移行になります。これは、さまざまな方法で実現できます。If that's the case the typical solution is moving away from InfoPath which can be done in various ways:

Azure PowerApps と Microsoft Flow

  • SharePoint データの読み取り/書き込みにリモート API を利用する SharePoint アドインを作成するBuild a SharePoint Add-In that leverages remote API's to read/write SharePoint data

InfoPath フォームを置き換える SharePoint アドインの作成Building SharePoint Add-In's to replace your InfoPath forms

InfoPath フォームを置き換えるために通常の SharePoint アドインを使用する場合には、いくつかのオプションがあります。When you opt to use regular SharePoint Add-In's to replace your InfoPath forms you do have several options. 次に示す 3 つのオプションについては精査していますが、これらのバリエーションを使用してもまったくかまいません。Below are three options we've worked out in more detail, but as said you can perfectly use variations of these. 次の 3 つのオプションについて、詳しく説明します。The three options we would like to dive into are:

Knockout サンプル

InfoPath フォームの変換を適切に支援できるように、一般的な 11 通りの InfoPath コーディング パターンを一覧に示し、これらのパターンを上記の 3 つの SharePoint アドインオプションで実装する方法について説明していますTo better help you with converting your InfoPath form we've listed 11 common InfoPath coding patterns and show you how you can implement those patterns using the above 3 mentioned SharePoint Add-In options. そのために、まず、最も一般的な InfoPath コーディング パターンを使用して参照用の InfoPath フォームを開発し、そのフォームを 3 種類の SharePoint Add-In に移行させました。To do so we've first developed a reference InfoPath form which uses the most common InfoPath coding patterns and then we've migrated that form to 3 SharePoint Add-In flavors. 次の各リンクは、これらの共通のパターンを示しています。Below links show these common patterns:

InfoPath データの移行Migrating your InfoPath data

InfoPath フォームを新しいソリューションに移行すると、InfoPath XML のデータを通常の SharePoint リスト データまたは任意のデータ層に移行することが必要になります。Once you've moved over your InfoPath form to a new solution you might also want to migrate your data from InfoPath XML to regular SharePoint list data or to the data layer of your choice. InfoPath のファイルは XML ファイルであるため、読み取りと変換は非常に簡単です。Since InfoPath files are XML files it's fairly easy to read and transform those. PnP - 変換リポジトリには、これを実現する方法を示すサンプルがありますThe PnP-Transformation repository contains a sample showing how you can achieve this.

コード ベースの操作が無効で、既存のフォームが開けなくなったCode-based operations are disabled and now my existing forms don't open anymore

コード ベースの操作が無効になると、すぐにサンドボックスではコードが実行できなくなります。As soon as code based operations are disabled it means that no code can run anymore in the sandbox. コードを実行しているフォームがある場合は、既存のフォームも開かなくなります。If you've forms that execute code it also means that opening of existing forms will not work anymore. この場合の対処方法は、以下のとおりです。Below steps will help you handle this:

  • InfoPath フォームを新しいソリューションに移行してあるなら、データの変換も済んでいるはずなので、問題ありませんIf you've migrated your InfoPath form to a new solution then you've most likely already converted your data and as such you're good
  • フォームをそのまま保持することを選んだものの (たとえば、ビジネスの重要度が低いなどの理由により)、既存のフォームを開きたい場合は、次の手順のいずれかを実行できます:If you opted to keep the form as is (e.g. since it's not business critical anymore) but you still want to open the existing forms then you can take one of the following steps:
    • フォームから分離コードを削除してから、再発行します (上記の「InfoPath フォームから分離コードを削除して修正する」をご覧ください)Remove the code behind from your form and republish it (see the Dropping code behind from InfoPath forms to fix them section above)
    • InfoPath クライアントを使用して、フォームを開きますUse InfoPath Client to open the forms
    • フォーム データを SharePoint リストのプレーン データに移行します (上記の「InfoPath データの移行」をご覧ください)Migrate the form data to plain SharePoint list data (see the Migrating your InfoPath data section above)