locked
リストおよびライブラリのリッチテキスト項目の内部名(g_Fields)の取得方法について RRS feed

  • 質問

  • 現在、クライアントからスクリプト(HTMLアプリケーション)でSharePointのListsウェブサービスのGetListItemsを利用して

    フォームライブラリ内にあるXMLデータをテキストファイルに抽出するバッチ処理を作成しております。

     

    テキスト項目や日付項目については、「ライブラリ>このビューの変更>ビューの編集画面」をソースの表示を行い

    「g_Fields」から内部名を取得して、GetListItemsで指定した項目を出力することまでは確認できております。

    但し、リッチテキスト項目についてはビューの編集画面のソースには内部名が存在せず(見つけられてないだけ?)

    テキスト出力することができておりません。

    どなたかリッチテキスト項目の内部名の取得方法について有用な情報をお持ちの方のご連絡をお待ちしております。

    2010年11月15日 5:25

すべての返信

  • まず、Webサービスとしてはリッチテキストも取得できます。
    単純に内部名の問題ですね。

    確かに、リストの設定画面から列の設定を開いても、URLに内部名がありません。(これは私も知りませんでした)
    リッチテキスト列の内部名を取得するには、あくまで「ひとつの」でしかありませんが
    1.アイテムを表示する(dispForm.aspx?id=n をひらく)
    2.ソースを表示する
    3.列の情報を表示しい箇所にコメントアウトされた FieldName="xxx" FieldInternalName="xxx" FieldType="xxx" がある
    これで確認できます。
    私が知る限りでは一番確実な方法です。
    SharePoint MANIACS あなたの SharePoint 活用できていますか?ちいさな「アドバイス」からご支援します。 http://sharepointmaniacs.com/
    • 編集済み 中村 和彦 2010年11月18日 23:57 タグ追加
    2010年11月18日 23:55
  • 中村 和彦 様

    ご回答ありがとうございます。

    そしてご連絡遅くなり申し訳御座いません。

     

    上記の方法について、もう少々詳しく教えて頂けませんでしょうか?

    現在、内部名を知りたいリッチテキスト項目についてはフォームテンプレート(Infopath)上及びフォームライブラリ上では

    フォームライブラリの列として設定されておりません。(設定する場合も管理部門の許可が必要です。)

    ---------------------------------------------------------------

    1.アイテムを表示する(dispForm.aspx?id=n をひらく)

    ---------------------------------------------------------------

    については、

     ①フォームライブラリ>設定>列の作成→複数行テキストとして列を作成し、フォームテンプレート(Infopath)側で列の紐付けを行う

     ②フォームテンプレート(Infopath)側で、フォームのオプション>フォームライブラリの列→リッチテキスト項目の追加

    ※この案件のInfopathはOffice2003を利用しています。

    上記の①もしくは②のいずれかが行われていることが前提として捉えてよろしいでしょうか?

    だとすれば、できればフォームテンプレートやライブラリの設定など変化をもたらさないよう内部名を取得できればと思っております。

    ちなみにリッチテキストには画像や表などは含まれてはおらず、文字列(改行含む)のみがで構成されているため

    フォームテンプレートの変更を簡単に行うことができれば、Infopath側でフォームライブラリの列追加でテキストとして追加して

    テキスト属性の内部名を取るだけの話なんですが…。

    お手数ですが、中村様及び皆様のお知恵を拝借できれば幸いです。

    2010年11月20日 5:27
  • 申し訳ない、Infopath については考慮していませんでした。

    次に、ご説明頂いて恐縮なのですが、ご要件がよくわからないです…。

    ○ Infpath2003(クライアント)をフォームライブラリに発行して利用

    ○ Infopath のリッチテキストに入力された内容をプログラム的に取得して利用したい

    ということでしょうか?


    SharePoint MANIACS あなたの SharePoint 活用できていますか?ちいさな「アドバイス」からご支援します。 http://sharepointmaniacs.com/
    2010年11月24日 5:04
  • 中村 様

    ご回答ありがとうございます。

    説明不足の拙い文章で申し訳ございません。

    私の目指しているものは、中村様が書かれた通り

    ---------------------------------------------------------------------------------------

    ① Infpath2003(クライアント)をフォームライブラリに発行して利用

    ②Infopath のリッチテキストに入力された内容をプログラム的に取得して利用したい

    ---------------------------------------------------------------------------------------

    の内容で更に、②の部分を下記方法(Lists.asmx/GetListItem)にてCSV出力を行いたいです。

    http://sharepointmaniacs.com/index.php?e=433

    現況としましては、リッチテキスト、添付ファイル以外の項目のエクスポートは成功しております。

    上記内容を実現するためには、やはり下記操作が必要でしょうか?

    ---------------------------------------------------------------------------------------

     ①フォームライブラリ>設定>列の作成→複数行テキストとして列を作成し、フォームテンプレート(Infopath)側で列の紐付けを行う

     ②フォームテンプレート(Infopath)側で、フォームのオプション>フォームライブラリの列→リッチテキスト項目の追加

    ---------------------------------------------------------------------------------------

    2010年11月24日 23:28
  • 時間がとれず試せていないので、確実でない点はご容赦下さい。

    ①は不要だと思います。基本的には、ShrarePoint側から拾うと思えば、かならずInfopathテンプレート側で発行時に「列として追加」して、ライブラリに連携してやる必要があります(ライブラリ側で列をつくるのではなく) 。

    私自身もワークフロー等でリッチテキスト列を取得→メール本文にそう挿入などよくしていますので、連携していればきちんととれる筈です。ただ、連携した際に、「リッチ」ではなくなってしまう記憶があったような(ただの複数行テキストに?)。このあたりはご確認下さい。

    なお、連携させずに取る方法もあると思います。InfopathのデータはプレーンなXMLなので、プログラム的に読み込んで、必要部分を XML的に抽出できる筈です。添付ファイルは、列として連携してもSharePoint側では1/0値、つまり「あるかないか」になってしまいますので、もし添付もとりたいのであれば、このアプローチが必須になると思います。


    SharePoint MANIACS あなたの SharePoint 活用できていますか?ちいさな「アドバイス」からご支援します。 http://sharepointmaniacs.com/
    • 回答としてマーク SUZUKIX 2010年11月29日 0:12
    • 回答としてマークされていない SUZUKIX 2011年2月5日 5:17
    2010年11月25日 23:50
  • 中村 様 ご回答ありがとうございます。 やはりそうですよね。 しかしながら、今回の案件についてはフォームテンプレートを触らずしてデータのみを取得することが大前提となっており 中村様の仰るとおりXMLとして取得してリッチテキストを取得することになりそうです。 Frameworkの入っていない端末への実装なので凝ったコーディングは避けたかったのですが…。 ご意見を参考にさせて頂いた上で再度相談、検討してみます。 中村様、ご協力ありがとうございました。
    2010年11月29日 0:10
  • なお、連携させずに取る方法もあると思います。InfopathのデータはプレーンなXMLなので、プログラム的に読み込んで、必要部分を XML的に抽出できる筈です。添付ファイルは、列として連携してもSharePoint側では1/0値、つまり「あるかないか」になってしまいますので、もし添付もとりたいのであれば、このアプローチが必須になると思います。

    回答済みとしておりましたが、上記方法への切り替えが認められたため、再度ご質問させて頂きます。

    開発環境はFramework2.0、言語はC#です。

    まず、上記の方法を以下のように試しました。

    ----------------------------------------------------------------------------------------------------------------

                    SPSecurity.RunWithElevatedPrivileges(delegate()
                    {

                        using (SPSite mySite = new SPSite(Properties.Settings.Default.strSiteUrl))
                        {
                            SPWebCollection subSites = mySite.AllWebs;
                            for (int i = 0; i < subSites.Count; i++)
                            {
                                if (subSites[i].ParentWeb == null)
                                {
                                    continue;   // トップレベルサイトはシカト
                                }

                                // リストコレクションの取得
                                SPListCollection lists = subSites[i].Lists;

                                // リストコレクション単位LOOP
                                for (int j = 0; j < lists.Count; j++)
                                {
                                    if (lists[j].BaseType.ToString() == SPListTemplateType.DocumentLibrary.ToString())
                                    {
                                        //ライブラリ接続
                                        SPFolder folder = subSites[i].GetFolder(lists[j].RootFolder.Url);

                                        cnt = folder.Files.Count;
                                        n = 0;

                                        // XML読込
                                        using (XmlTextReader reader = new XmlTextReader(subSites[i].Url + "/" + folder + "/" + folder.Files[k].Name + "?noredirect=true"))
                                        {
                                            reader.Read();←ここで「リモート サーバーがエラーを返しました: (401) 許可されていません」が発生します。

                                            while (!reader.EOF)
                                            {
                                                //この中でXMLからCSVへ書き込み
                                            }
                                        }

                                        // CSV出力
                                        sw.WriteLine("");


                                    }
                                }
                            }
                        }


                        //// 書き込み終了
                        //sw.Close();
                    });

    ----------------------------------------------------------------------------------------------------------------

    ちなみにSPSecurity.RunWithElevatedPrivilegesで権限の昇格を行っても同様のエラーでした。

    上記の原因や確認事項、または上記方法以外にInfoPathから発行していない列や、リッチテキスト列(こちらは入ってるか入っていないかが分かればOK)を

    取得する方法をご存知の方がいらっしゃればご教授頂きたくお願い申し上げます。

    2011年2月5日 5:42
  • 直接のご回答になりませんが・・・(申し訳ない/具体的なコードはコーダの方にお任せしたいと思います)

    コーディングをしない、という意味では、私ならNintexを利用します。

    NintexはGUIベースでXMLの読み込みと処理ができます。

    もちろん、有料ソリューションなのですが。

     


    SharePoint MANIACS あなたの SharePoint 活用できていますか?ちいさな「アドバイス」からご支援します。 http://sharepointmaniacs.com/
    2011年2月10日 0:14
  • > using (XmlTextReader reader = new XmlTextReader(subSites[i].Url + "/" + folder + "/" + folder.Files[k].Name + "?noredirect=true"))

    ひとつ気になったのですが、ひょっとして Infopath は FormService 環境でしょうか?

    XMLにアクセスするのに「"?noredirect=true」は不要な気がしました。

    ※確証はないです。あくまでヒントになれば・・・ということで。


    SharePoint MANIACS あなたの SharePoint 活用できていますか?ちいさな「アドバイス」からご支援します。 http://sharepointmaniacs.com/
    2011年2月10日 0:18
  • > using (XmlTextReader reader = new XmlTextReader(subSites[i].Url + "/" + folder + "/" + folder.Files[k].Name + "?noredirect=true"))

    ひとつ気になったのですが、ひょっとして Infopath は FormService 環境でしょうか?

    XMLにアクセスするのに「"?noredirect=true」は不要な気がしました。

    ※確証はないです。あくまでヒントになれば・・・ということで。


    SharePoint MANIACS あなたの SharePoint 活用できていますか?ちいさな「アドバイス」からご支援します。 http://sharepointmaniacs.com/


    中村 様

    ご回答ありがとうございます。

    今回対象となるサイトについては、Infopath Forms Servicesは利用しておりません。

    フォームライブラリ&クライアントにはInfopathインストール済み環境です。

    「noredirect=true」に関しては、申し訳ございません、色々試した残骸でした…。(無しでも同様のエラーが発生しております)

    「Nintex」については、過去に紹介頂いたこともあり、のどから手が出るほど欲しいのですが、いかんせん費用が出ません。

    WebDAV&WebClientを利用してInfopath(XML)ファイルを取得してみようと思います。

    結果についてはまた書き込みます。

    引き続き有用な情報が御座いましたら、よろしくお願い致します。

    2011年2月10日 10:39