はじめに
SharePoint を活用していると、リスト内のデータを効率的に管理・表示するための工夫が求められることがあります。特に、複数行テキスト列に格納された複数のURLを、個別のハイパーリンクとして表示したいというニーズは多くのユーザーに共通する課題ではないでしょうか。
私自身、この課題に直面し、試行錯誤を繰り返しました。本記事では、その失敗から成功までの全プロセスを詳細に解説します。同じ悩みを抱える方々の参考になるよう、余すところなく情報を提供します。
さらに、この記事はGoogle SEOを意識したキーワードの盛り込みと記事構成になっていますので、情報を探している多くの方に届くことを願っています。
背景と課題の設定
課題の概要
SharePoint リストで、複数行テキスト列(以下、列A)に複数のURLを格納し、それらを別の列(以下、列B)で個別のハイパーリンクとして表示したいと考えました。
具体的な要件は以下の通りです。
- 列A:ユーザーが入力する複数のURLを、セミコロン(
;
)区切りで格納。 - 列B:列Aに入力された各URLを、個別のハイパーリンクとして表示。
なぜこの機能が必要なのか
業務上、関連する複数の資料やウェブページへのリンクを一元管理したいケースが多々あります。例えば、プロジェクトの関連ドキュメント、参考資料、外部サイトなどです。それらを一覧表示し、クリック一つでアクセスできると非常に便利です。
しかし、SharePoint 標準の機能では、1つのフィールドに複数のハイパーリンクを持たせることが難しいため、工夫が必要でした。
初期のアプローチ:JSONコードでの列の書式設定
試したJSONコードとその意図
まず最初に考えたのは、SharePoint の列の書式設定で JSON コードを使用し、動的にハイパーリンクを生成する方法です。以下が試したJSONコードです。
{
"$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
"elmType": "div",
"forEach": "url in split(@currentField, ';')",
"children": [
{
"elmType": "a",
"txtContent": "=trim(url)",
"attributes": {
"href": "=trim(url)",
"target": "_blank"
},
"style": {
"display": "block",
"margin-bottom": "5px"
}
}
]
}
このコードの意図:
split(@currentField, ';')
:セミコロン区切りのURLを分割し、配列として取得。forEach
:取得した配列をループし、各URLに対して処理を行う。children
:各URLをハイパーリンクとして表示。elmType
: “a”:ハイパーリンク要素を生成。txtContent
:リンクの表示テキストを設定。href
:リンク先のURLを設定。
発生した問題と原因分析
問題点:
- このJSONコードを列Bに適用しても、期待したハイパーリンクが表示されず、列Bの内容が消えてしまう。
原因の考察:
- 列Bのフィールド設定:
- 「書式なしテキスト」に変更してみましたが、効果なし。
- データ内の特殊文字やスペース:
- 区切り文字をカンマからセミコロンに変更し、データとコードを調整しましたが、状況は変わらず。
- JSONコードのフィールド参照:
@currentField
の代わりに列Aまたは列Bの内部名を使用してみましたが、結果は同じ。
- SharePoint の列の書式設定の制限:
split
関数やforEach
構文がサポートされていない可能性が高い。
解決策の模索と再挑戦
他に考えたアプローチ:
- 複数のハイパーリンク列を作成:
- 事前に複数のハイパーリンク列(リンク1、リンク2、リンク3など)を作成し、それぞれにURLを格納。
- 問題点:URLの数が固定されていないため、現実的ではない。
- 列の書式設定の見直し:
- よりシンプルなJSONコードでテスト。
{
"$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
"elmType": "div",
"txtContent": "@currentField"
}
- 結果:列Bの内容は表示されるが、ハイパーリンクにはならない。
結論:
- 列の書式設定(JSON)だけでは、要件を満たすことが難しい。
別の方法:Power Automate の活用
Power Automate を選択した理由
Power Automate(旧 Microsoft Flow) は、Microsoft が提供するクラウドベースのワークフローエンジンです。これを使用することで、SharePoint リストに対する高度な操作や自動化が可能になります。
選択した理由:
- 文字列操作やループ処理が柔軟に行える。
- SharePoint リストとの統合が容易。
- ユーザーインターフェースが直感的で、コーディングの知識が少なくても操作可能。
フローの設計と実装手順
1. SharePoint リストの準備
- 列A(URL一覧):
- 種類:複数行テキスト
- テキストの種類:書式なしテキスト
- 内容:セミコロン区切りで複数のURLを格納。
- 列B(リンク集):
- 種類:複数行テキスト
- テキストの種類:拡張リッチテキスト(画像、表、ハイパーリンクなどをサポート)
2. Power Automate フローの作成
手順詳細:
- フローの作成:
- Power Automate にアクセスし、新しい自動化されたクラウドフローを作成。
- トリガー:
SharePoint - アイテムの作成または変更時
- 変数の初期化:
URLText
(文字列型):列Aの値を格納。LinkRichText
(文字列型):ハイパーリンクを格納するための変数。
- URLの分割:
Compose
(構成)アクションを使用し、split
関数でURLText
を分割。split(variables('URLText'), ';')
- ループ処理:
Apply to each
(各に適用)アクションを使用し、Compose
の出力(URLの配列)をループ。
- ハイパーリンクの生成:
Append to string variable
(文字列変数への追加)アクションを使用し、LinkRichText
にハイパーリンクを追加。concat( '<a href="', trim(item()), '">', trim(item()), '</a><br/>' )
- SharePoint アイテムの更新:
Update item
(アイテムの更新)アクションを使用し、LinkRichText
の値を列Bに保存。
発生したエラーとその解決策
エラー1:items('Apply_to_each') の問題
エラーメッセージ:
The template validation failed: 'The template action '変数の設定' at line '1' and column '1841' is not valid: "The template language function 'items' must have at least one parameter.".'.
原因:
items()
関数はパラメータが必要だが、引数なしで使用しているためエラー。
解決策:
items()
をitem()
に置き換える。item()
はループ内で現在のアイテムを参照する関数で、引数は不要。
修正後のコード:
concat(
variables('LinkRichText'),
'<a href="',
trim(item()),
'">',
trim(item()),
'</a><br/>'
)
エラー2:変数の自己参照の問題
エラーメッセージ:
Self reference is not supported when updating the value of variable 'LinkRichText'.
原因:
SetVariable
アクションで変数自身を参照して更新しようとしている。
解決策:
SetVariable
の代わりにAppend to string variable
アクションを使用。- これにより、変数に対して値を追加することが可能になる。
修正後のフロー:
- ループ内でのアクション:
Append to string variable
を使用し、以下の値を設定。concat( '<a href="', trim(item()), '">', trim(item()), '</a><br/>' )
エラー3:HTMLタグがそのまま表示される問題
問題:
- 列Bにハイパーリンクではなく、HTMLタグがそのまま表示される。
原因:
- SharePoint のセキュリティ設定で、HTMLタグの使用が制限されている可能性。
解決策:
- 列Bの設定を確認:
- 「拡張リッチテキスト」になっていることを再確認。
- サイトコレクション管理者の権限がない場合の対処:
- 今回は権限がなかったため、別の方法を検討。
- 別のアプローチ:
- 内部XML形式を利用してハイパーリンクを生成。
最終的な成功と結果の確認
フローの全体像
フローの構成:
- トリガー:アイテムの作成または変更時。
- 変数の初期化:
URLText
:列Aの値を格納。LinkRichText
:空の文字列で初期化。
- URLの分割:
Compose
アクションでsplit
関数を使用。
- ループ処理:
Apply to each
で URL の配列をループ。
- ハイパーリンクの生成:
Append to string variable
でLinkRichText
にハイパーリンクを追加。
- アイテムの更新:
Update item
でLinkRichText
の値を列Bに保存。
動作確認と成果
- フローを保存し、SharePoint リストで新しいアイテムを作成。
- 列Aにセミコロン区切りで複数のURLを入力。
- フローが正常に実行され、列Bに各URLがハイパーリンクとして表示。
- 結果:
- URLの数が変動しても、自動的に対応可能。
- ユーザーは列AにURLを入力するだけで、ハイパーリンクが生成される。
まとめ:成功へのポイントと学び
主な学び
- 列の書式設定(JSON)の限界を理解する:
- SharePoint の列の書式設定では、使用できる関数や構文が制限されている。
split
やforEach
が使用できないため、複雑な文字列操作は難しい。
- Power Automate の活用が解決策となる:
- 文字列操作やループ処理が可能であり、SharePoint リストとの連携も容易。
- エラーメッセージを活用する:
- 発生したエラーを詳細に読み解くことで、問題の原因を特定し、適切な解決策を見つけることができる。
- 権限や環境の制約を考慮する:
- サイトコレクション管理者の権限がない場合でも、可能な方法を模索する。
- 試行錯誤を恐れない:
- 複数のアプローチを試し、失敗から学ぶことで、最適な解決策にたどり着ける。
成功へのポイント
- Power Automate の適切なアクションを選択する:
SetVariable
とAppend to string variable
の違いを理解し、目的に合ったアクションを使用する。- 関数の正しい使用:
item()
とitems()
の違いを理解し、適切に使用する。- ユーザーの要件を正確に反映する:
- URLの数が変動するという要件に対し、柔軟に対応できるフローを構築する。
よくある質問(FAQ)
Q1. 列の書式設定でできない理由は?
A1.
SharePoint の列の書式設定(JSON)では、使用できる関数や構文が制限されています。split
関数や forEach
構文はサポートされていないため、これらを使用して複数のURLを分割・ループ処理することはできません。
Q2. サイトコレクション管理者の権限なしで可能?
A2.
はい、可能です。今回の方法では、Power Automate を使用し、HTMLタグを含むリッチテキストを列Bに保存しています。サイトコレクション管理者の権限がなくても、ユーザーがアイテムの作成・編集権限を持っていれば実装できます。
Q3. URLの区切り文字を変更したい場合は?
A3.
列Aで使用する区切り文字を変更する場合、Power Automate の split
関数内の区切り文字も合わせて変更する必要があります。例えば、カンマ(,
)を使用する場合:
split(variables('URLText'), ',')
Q4. HTMLタグがそのまま表示される場合の対処法は?
A4.
列Bの設定が「拡張リッチテキスト」になっていることを確認してください。また、環境によっては、SharePoint のセキュリティ設定で HTML タグの使用が制限されている場合があります。その場合、サイト管理者に相談して、HTMLタグの使用を許可してもらう必要があります。
追加情報と参考資料
関連するキーワード
- SharePoint
- Power Automate
- 複数行テキスト
- ハイパーリンク
- URL一覧
- 列の書式設定
- JSONコード
- エラー解決
- ループ処理
- 文字列操作
- SharePoint リスト
- リッチテキスト
- サイトコレクション管理者
- トリガー
- アクション
- フロー
- 関数
- 変数
参考にした公式ドキュメント
- Microsoft Docs – Power Automate
- Power Automate のドキュメント
- SharePoint 列の書式設定
- 列の書式設定の概要
- 関数リファレンス
- Azure Logic Apps の式と関数
- Power Automate でのループ処理
- Apply to each アクションの使用
コメント