見出し画像

【Power Automate×Officeスクリプト】毎月特定の日以降に書類未提出者の一覧をメールし続けるフロー

こんにちは。aliceです。
寒いですね。冷蔵庫の中に住んでいるのではないかというくらい寒いですね。

今日はPower AutomateとOfficeスクリプトを使って、「毎月特定の日以降に書類未提出者の一覧をメールし続けるフロー」のはなしです。

具体的には「毎月25日以降」の「平日」に「書類の未提出者の一覧」を取得して、「この人はまだ書類を提出していないよ!」というメールを送信するフローです。
全員が提出するまで毎日(月が変わるまで)メールを送信し続けます。

ホラー


まずこのようなExcelの表があります。

この表から未提出者(提出日が書かれていない人(芋))の一覧を取得します。
この場合は「べにはるかさん」と「シルクスイートさん」ですね。

そして、毎月25日以降に未提出者がいるときはメールを送信します。
下のカレンダーでいうと〇が付いている日です。

こんな感じのメールが届きます💦

このメールを未提出者がいなくなるまで、そして月がかわるまで毎日送信します。

はい、怖いですね😱
外も寒いので凍えレベルが2倍になりますね。
寒い冬にはぴったりのフローです。

ホラー


ということで実際に作ったのがこちらです。

今回はなるべくOfficeスクリプトで書けるところはOfficeスクリプトで書きました。
コードを書けるところはなるべく書きたい派なのです。

それでは、中身を見ていきましょう。
あたたかい飲み物とともにどうぞ。


Officeスクリプト編

ではでは、まずはOfficeスクリプトから見ていきましょう。

未提出者を取得する

まずは、未提出者を取得します。

このようなExcelの表から未提出者(提出日が記入されていない人(芋))を取得します。

ということで書いてみました。

function main(workbook: ExcelScript.Workbook): string {
    const sheet = workbook.getWorksheet('提出確認');
    const values = sheet.getUsedRange().getValues();
    values.shift();
    const array: string[] = [];
    for (let value of values) {
        if (value[3] === '') array.push(value[1] + ' ' + value[2]);
    }
    const message = array.join('<br>');
    return message;
}


arrayという配列に「部署名+スペース+名前」を要素として入れます。

["いも課 べにはるか", "いも課 シルクスイート"]

このような配列ができました。


そして、メールに一覧として表示したいので「いも課 べにはるか」という形式で取得します。

joinメソッドを使って、配列arrayの要素を「<br>」で結合した文字列にします。

いも課 べにはるか<br>いも課 シルクスイート

これで、メールで送信するときに改行してくれます。
Power Automateのアクションを少しでも減らす作戦です。



メールアドレスを取得

次にメールアドレスを取得します。
先ほどの未提出者の取得とほとんど同じです。

こちらはこのままメールの宛先として使用したいので、作成した配列をjoinメソッドを使って「;」で結合しました。

function main(workbook: ExcelScript.Workbook):string {
  const worksheet = workbook.getWorksheet('送信先一覧');
  const values = worksheet.getUsedRange().getValues();
  values.shift();
  const records = values.map(record => record[1]);
  const address: string = records.join(';');
  return address;
}


Excelからデータを取得できたので、次はPower Automateでフローを作っていきます。


Power Automate編

ここからは、Power Automate編です。

繰り返し

まずは平日は繰り返すというトリガーを作成します。
平日なので設定曜日を月曜日から金曜日にします。
今回は朝6時に実行してみました。ここらへんはお好みです。

変数を初期化する

実行日の日付を取得する変数を作成します。
dayという名前の変数に実行日の日付を取得して入れます。

例えば1月23日だったら「23」という整数です。

数式はこちら

int(convertTimeZone(utcNow(),'UTC','Tokyo Standard Time','dd'))

実行時の日付のタイムゾーンを東京にして、日付だけ取得します。
そして、convertTimeZone関数の戻り値は文字列型なので、数値型に変換します。


スクリプトの実行

先ほど作成したスクリプトを実行していきましょう。

場所などは作成した場所から選択してください。

条件

条件を設定します。
「毎月25日以降」の「平日」に「書類の未提出者の一覧」を送信したいので次のとおり設定します。

  • 日付が25日以降(変数dayの値が25以上)

  • 未提出者がいる場合(未提出者取得のスクリプトの戻り値がないときを除いく)

「平日」にというのはトリガーで設定しましたので、ここでは不要です。


全体像はこちら。

メールの送信

条件に一致するときはメールを送信します。

フローはこれで完了です。
あとはテストして実行してみましょう。

フローの実行

それでは、フローを実行してみます。

無事にメールが送信されました。

ガクブルですね。


参考

convertTimeZone関数はようさんのブログがわかりやすかったです。
いつも気ままに勉強会でお世話になっているようさん。
ありがとうございます!!


Officeスクリプト記事まとめ📝


『Officeスクリプト入門講座』を書きました📝


この記事が気に入ったらサポートをしてみませんか?