2023年てんこの冬休みの宿題。到着メールをPower Automateを使ってSharePointリスト化するお話です。
前置き
会社でのお話。
メールがたくさん飛んできて、それを台帳に記入して、メールが届いたあとの処理の進捗を台帳で管理してる業務があります。
そういった業務は複数あって、それぞれ異なる項目で台帳を作っていたりします。
しかも台帳はExcelで、記入は手動だったりします。
今回は、SharePointリストを台帳として利用して、Power Automateで最初の記入をするところまでを自動化してみます。
用意するもの
- 台帳となるSharePointリスト
- メールが届いたらリストにアイテムを作成するPower Automate フロー
- メールの本文から台帳記入に必要な情報を抜き出すOfficeスクリプト付きExcelファイル
SharePointリスト
管理番号とか種別は今回の対象業務固有の話なので、他の業務に応用するときはまた別の項目になる可能性大。
メールの台帳なので、いつ、誰から来たかくらいはあったほうがいいのかなという程度で、基本的には業務に必要な項目でリストを作成します。
名前 |
種類 |
ID |
デフォルト |
Created |
デフォルト |
件名 |
メール件名 |
送信者 |
メールの送信者 |
本文 |
本文 |
管理番号 |
本文に記載される案件の管理番号(業務固有) |
種別 |
本文に記載される案件の種別(業務固有) |
Officeスクリプト
Power Automateのフローを作成する前にOfficeスクリプトを用意します。
function main(workbook: ExcelScript.Workbook, bodyText: string)
{
let body = bodyText;
body = deleteQuoteFromBody(body);
let rtn = extractReceiptInfo(body)
return {
"snum": rtn[0],
"skind": rtn[1]
};
}
function deleteQuoteFromBody(tbody: string): string {
let rtn: string;
const regex = /-+Original Message-+/;
if (regex.test(tbody) == true) {
let splited = tbody.split(regex);
rtn = splited[0];
}
else {
rtn = tbody;
}
return rtn;
}
function extractReceiptInfo(tbody: string): string[] {
let rtn: string[] = [];
const regex_snum = /管理番号:(\d\d\d\d-\d\d)/;
let snum = tbody.match(regex_snum);
if (snum == null) {
rtn.push("");
}
else {
rtn.push(snum[1]);
}
const regex_kind = /種別:(.+)$/m;
let kind = tbody.match(regex_kind);
if (kind == null) {
rtn.push("");
}
else {
rtn.push(kind[1]);
}
return rtn;
}
このスクリプトは、メール本文から必要な情報(今回は管理番号と種別)を抽出するために用意しています。
説明は省いてますが、SharePointドキュメントライブラリ上にExcelファイルを用意して、ブラウザでExcelファイルを開いた上でOfficeスクリプトを作成しています。
Power Automateフロー
Officeスクリプトの用意ができたら、最後にPower Automateフローを作成します。
このフローは、フローを作成する時に指定したアカウントのメールボックス内「Inbox」にメールが届くと動くようになります。
実際には他にもメールがたくさん届くので、Outlook上で振り分けをしておいて該当のメールだけ特定のフォルダに入れるようにして、そのフォルダーを対象にするのが無難かなと思います。
メールがプレーンテキストかHTML形式かわからないので、念の為HTMLからテキストに変換するコネクターを使用しています。この機能は現時点でプレビュー版のようです。
ポイント
Officeスクリプトの引数
Officeスクリプトを最初に作成したときは、次のようになってるはずです。
function main(workbook: ExcelScript.Workbook) {
}
で、今回はこれに引数を一つ付け足してます。
function main(workbook: ExcelScript.Workbook, bodyText: string)
{
}
こう書いておくと、Power Automateフローでこのスクリプトを指定したときに、bodyTextに何のデータを渡すかを指定できるようになります。
フローより先にOfficeスクリプトを作成しておく理由の一つはこれです。
Officeスクリプトの戻り値
今回Officeスクリプトにメールの本文を渡して、その中から管理番号と種別を抜き出してもらうという処理をさせようと思います。
メールの本文は引数として渡すとして、戻り値には管理番号と種別の2つの値を返して貰う必要があります。
2つの値を返すために、戻り値はオブジェクトの形にしてあります。
return {
"snum": rtn[0],
"skind": rtn[1]
};
こう書いておくと、Power Automateフローでこのスクリプトを指定したときに、スクリプト実行後のステップで処理結果のsnumとskindを使用することができるようになります。
参考にさせていただいた記事
vicugna-pacos.github.io