M365環境でお問合せ管理を実現した話
前置き
自己紹介
非上場の外資系子会社で経理をやっております。
解決したかった状況
日々他部門からいろいろな問い合わせが舞い込みます。部門のグループアドレス宛に送ってくれることが多いですが、個人のメールアドレス宛に来てしまうこともあります。
その個人が無事解決できれば何も顕在化しないのですが、うっかりジュニアの方が受けてしまい、エスカレーションできずに対応漏れになり部門に迷惑をかけてしまったりします。エスカレーションしづらい体制はそれはそれで改善を要するのですけど、そもそも「見せる」行動にストレスがかかるので、最初から「見える」ほうがいいよねということでリスト管理を志向しました。
ソリューション案
概要
M365環境を利用します。会社の環境がM365だったのでそれを使うしかなかったとも言います。
Forms
入力の入り口を統一します。添付ファイルにも対応します。Lists
問い合わせ管理の本丸です。ここにすべての情報を集約します。
Listsそのものは経理部門クローズドのチーム内に設置します。そのままだと質問者もアクセスできないので、作成されたアイテムごとにアクセス権を付与します。質問者は自分が質問したアイテムのみアクセスすることができます。便利!Teams
Formsで投稿されたら通知します。質問内容によって対応する部門にメンションをつけます。担当者が決まっているならバイネームでメンションしてもいいですね。Automate
上記3サービスをつなぎます。この記事はAutomateの設計がメインです。
ざっくりフロー
Formsで投稿
Formsの内容をListsのアイテムに転記
Listsのアイテムに質問者のアクセス権、Formsの添付ファイル、担当部門情報を付与
Teamsチャネルに投稿があった旨をPOST
Teams投稿のリンクをListsのアイテムに付与(念のため)
作り方解説
各サービスの設計
入り口のForms
いろいろ必要な項目はあると思いますが、いったんこんな項目で構成しました。
・質問者の所属部門
・質問者の氏名
・質問内容概要(選択式)
・質問内容詳細(記述式)
・添付ファイル
・緊急度
・対応期限
最初の2項目は質問者情報なので、FormsのResponder情報から取得できればわざわざ書いてもらうことはないかもしれません。
質問内容概要は、選択式にすることで問い合わせ内容の類型化を図ります。同時に、この選択で対応部門を振り分けます。本丸のLists
とりあえずプライベートチームに作っておきましょう。オープンにしていい内容ならオープンでもいいですけど、だいたい用途が限られちゃうので。
Formsで収集する情報と同じカラムを用意しておきます。通知用のTeams
部門のチーム内に通知用チャネルを作ることを推奨します。つなぎのAutomate
次項で詳述します。
Automateの作り方
最初に作ったフローを画像で確認しながら説明します長いのでごめんなさい。フローをわかりやすくするためフロー項目名称を編集していますので、横にカッコ書きでアクション名称を併記します。
新しい応答が作成されるとき
これがAutomateフローのキックになります。作ったFormsのタイトルを指定しましょう。Formsをチーム内に作ると多分選択肢に登場しないため、「カスタムID」で指定する必要があります。フォームURLの「&ID=」以下をコピペしてください。Formsの内容を取得(「応答の詳細を取得」)
ここでも↑と同じFormsを指定します。Formsの入力内容を以下のフローで使えるように各変数に格納します。Forms投稿時間を日本時間に変換(「タイムゾーンの変換」)
そのままだと時間がグリニッジ標準時なので、日本時間に調整します。Forms投稿者IDを取得(「ユーザの検索(V2)」)
Formsでは投稿者のIDが自動で取得されるので、そのIDをもとにActiveDirectry(だっけ?)で持っているユーザ情報を取得しておきます。
Listsに新規項目を作成(「項目を作成」)
サイトのアドレス:Listsを作成したTeamを指定
リスト名:Listsのタイトルを指定
その他の項目:Formsから連携したい項目をそれぞれ指定
★タイトルは一意がいいかなーと思ってForms応答IDにしていますが、管理しやすいものを使ってください。
★ステータスは初期値として「未着手」をセットしています。
★受付時間はさっき変換した日本時間になるようにセット。
項目に先頭コメントを追加する(「SharePoint に HTTP 要求を送信します」)
コメントにメンションつけないとメールで通知が飛ばないので、それを徹底してもらうように自動でコメントが作成されるようにしています。めんどくさいのでなくてもいいかも・・・。
やり方は以下URLを参考にしてください!丸投げ!
https://mynote365.hatenadiary.com/entry/2020/11/28/204840
アイテムまたはフォルダーへのアクセス権の付与
プライベートチーム内のリストアイテムのため、アイテムごとにアクセス権を付与します。ついでに対象のアイテムへのリンクも飛ばしてくれます。
「受信者」に先程のユーザ情報取得で取得したメールアドレスを指定します。これ、FormsのResponder's Emailでもいいのでは・・・?
条件分岐。添付ファイルがある場合とない場合です。条件は、「Formsで添付ファイルがあるか」。添付ファイルをつける項目がtrueかどうかで判定しています。
数式で「true」と入力してください。
添付ファイル名をJSON形式で取得(「JSONの解析」)
複数の添付ファイルに対応するため、JSON形式でファイル名を取得します。
スキーマは以下の通り。エラー出たらごめんなさい。詳しくないんです。
{
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"link": {
"type": "string"
},
"id": {
"type": "string"
},
"type": {},
"size": {
"type": "integer"
},
"referenceId": {
"type": "string"
},
"driveId": {
"type": "string"
},
"status": {
"type": "integer"
},
"uploadSessionUrl": {}
},
"required": [
"name",
"link",
"id",
"type",
"size",
"referenceId",
"driveId",
"status",
"uploadSessionUrl"
]
}
}
パスによるファイルコンテンツの取得
添付するためのファイルを取得します。ファイルパスはFormsの添付ファイルが格納されるパスを指定して、最後のファイル名を先程のJSONから「name」を指定します。添付ファイルの追加
↑で取得したファイルコンテンツをListsのアイテムに追加します。
担当部門名を追加
実は一番悩んでいる箇所。めんどうになったのでとりあえず条件分岐で実装しています。Xの言葉を含む場合はA部門とする、みたいな感じです。
「項目の更新」アクションで、Listsのアイテムに対して部門の情報を付与します。
最初に作成したListsの項目情報を取得(「項目の取得」)
ここまでいろいろアイテムを更新してきたので、改めてアイテムの情報を取得しておきます。以下のTeams投稿用です。
Teamsチャネルにメッセージを投稿(「チャットまたはチャネルでメッセージを投稿する」)
Teamsにメッセージを投稿します。いまはメンションがないので「フローボット」でもいいのですが、メンションつける場合は「ユーザー」にしないとエラーになったりします。
内容はTeamsで見えるといいなくらいの情報で。あまり長いと「詳細表示」しないと見えなくなっちゃうので適度な方が一覧性があっていいです。最後にListsへのリンクをつけるのがポイントです!
投稿されたTeamsメッセージのリンクをLists項目に追加(「項目の更新」)
もともとはTeamsでチーム内議論をしたりするかなと思ったので、ListsとTeamsの相互参照を担保するためにこの項目を入れていました。ただ、どうせならListsアイテムのコメントにすべて集約したほうがいいなと思っていて、これはなくしてもいいかもしれません。あって困るものではないので残しています。
最後に
長々書いてしまい申し訳ありません!最後まで読んでいただいてありがとうございます。
わたしもプログラミングの知識などほとんどなく、WEBでいろいろ検索しまくって試行錯誤してなんとか形に出来ました。
「こんなことやりたい」「これができたら便利だよね」があれば、それを実現する方法を考えるフェーズに移れるので、とにかくいろいろなニーズがほしいですね!なので「こんなこともできるんだよ~」というのを社内に示していくのも大事な活動かなと思っていろいろやっています。