Teamsの自動投稿を、上司が朝礼で読み上げていた

Teamsの自動投稿を、上司が朝礼で読み上げていた|Power AutomateとBoxで「朝の1画面」を作った

アーティファクトで、何か作ってみたかった きっかけは単純で、アーティファクトで何か作ってみたかった。 Boxの管理画面を作った記事で書いたとおり、アーティファクトは「実行ボタン」から「常設の画面」まで作れる。ただ、作れることが分かっても、何を作ればいいかは別の問題だ。道具を先に手にして、使い道を探している状態だった。 朝礼で見かけた光景 使い道は、朝礼にあった。 毎朝8時、Teamsにいくつかの通知が自動で届く。上司から頼まれて、以前Power Automateで作ったものだ。今は4種類ある。実施漏れ、連携漏れ、登録漏れ、未完了——どれも「やり忘れがないか」を知らせる通知だ。 もとをたどると、どれも誰かが毎日手でやっていた確認だった。管理職がSalesforceのレポートを開いて数字を拾っていたものもあれば、自分が朝礼前に集計していたもの(未連携チェックの記事)もある。それを自動投稿に置き換えた。 ある朝、朝礼を見ていて気づいた。 上司が、その投稿を開いて読み上げていた。 通知はちゃんと使われていた。見られていない、ということはない。ただ、4つの投稿を順番に開いて、数字を口頭で伝える——Teamsと朝礼のあいだを、人がつないでいた。 書類チェックの記事で「出口が大事」と書いた。この通知には出口があった。朝礼だ。でもその出口まで、最後の一歩は人が運んでいた。 人が読み上げているものは、まだまとめる余地がある。 投稿を1つずつ見に行かなくても、全部が1画面に集まっていて、その横に朝礼で話すことをメモできる。管理職にとって便利なのは、たぶんそういう画面だと思った。 作ったもの 毎朝8時20分に自動で更新される画面を、アーティファクトで作った。 表示するもの 内容 4種類の通知 それぞれの件数(登録漏れは内訳も) 元の投稿へのリンク 各項目からTeamsの投稿へ飛べる 本日未更新の表示 その日のデータがまだ来ていなければ「⚠️ 本日未更新」と出す メモ欄 右側に自由に書ける。書いた内容は自動で保存される 地味だが気に入っているのは「本日未更新」の表示だ。数字が昨日のままでも、画面だけ見ていると気づけない。古い情報を新しいものと思い込むのがいちばん怖いので、はっきり分かるようにした。 2回失敗した 画面の形はすぐ決まった。難しかったのは、データをどこから持ってくるかだった。 1回目:Teamsの投稿を直接読む → 断念 最初に考えたのは素直な方法だ。社内のClaudeには、TeamsなどMicrosoft 365とつながる機能(コネクタ)がある。それで今朝のTeams投稿を探して、数字を読み取ればいい。 ところが、試してみると使えなかった。 「日付で絞る」ことと「チャネルの投稿を探す」ことが、同時にできない。 日付で絞れる探し方はチャネルの投稿に対応しておらず、チャネルの投稿を探せる方法は日付で絞れない キーワードを変えて何度も探そうとすると、呼び出しが多すぎると拒否されて、結果が0件になる 「今朝の、このチャネルの投稿」という一番ほしい探し方が、仕様の組み合わせでできなかった。どこにも書いていない制約で、試して初めて分かった。 2回目:SharePointのリストを経由する → 断念 次に考えたのは、Power Automateに結果を別の場所へ書かせる方法だ。Teamsに投稿するついでに、SharePointのリスト(表のようなもの)にも書き込む。 書き込みは成功した。ところが今度は、Claudeの側にSharePointのリストを読む手段がなかった。 書けるのに、読めない。これも実際にやってみて初めて分かった。 3回目:Boxのファイルでつなぐ → 成功 最後にたどり着いたのがこれだ。 Power Automate(毎朝8:00) ↓ これまで通りTeamsに投稿 ↓ 同時に、BoxのTXTファイルに結果を上書き保存 (投稿日時・件数・Teamsへのリンク) アーティファクト(毎朝8:20) ↓ Boxのファイルを読んで、画面に表示 BoxはClaudeから問題なく読めることが、前に作った管理画面で分かっていた。Power Automate側は、既存のフローに**「Boxへの書き込み」を1つ足すだけ**で済んだ。 3回目も、ファイルでつないだ 書いていて気づいたのだが、これは3回目だ。 記事 何をファイルでつないだか 書類の仕分け 仕分けが終わった合図 書類のチェック 新しく増えたフォルダの一覧 今回 毎朝の通知の結果 どれも「直接つながらないものを、ファイル1つでつなぐ」形になっている。 ...

2026年9月29日 · 1 分
Salesforceの未連携チェックを自動化した

Salesforceの未連携チェックを自動化した|CSV連携でハマった6つの罠

「朝にしかできない仕事」だった Salesforceに登録された作業実績が、別の仕組みに正しく連携されているか。連携に失敗したものが残っていないか。これを毎日確認する仕事があった。 厄介だったのは、この確認が朝にしかできなかったことだ。 データを集計するバッチ処理が夜間に走る。だから前日分の結果が出揃うのは朝。そして確認した内容は朝礼で共有する必要がある。つまり毎朝、出社してから朝礼までのあいだに、Salesforceを開いてレポートを出して、未連携のものを拾い出す——という作業が固定で入っていた。 自動化の価値は「時短」だけではなかった こういう話を書くとき、たいていは「作業時間が何分減りました」という数字を出すものだと思う。ただ、今回いちばん効いたのはそこではなかった。 朝のいちばん忙しい時間帯を、この作業のために空けておかなくてよくなった。 作業そのものの時間が長いわけではない。それでも「朝礼に間に合わせなければならない」という制約があると、その時間は他のことに使えない。別の急ぎが入れば焦るし、遅れれば朝礼に響く。時間の"長さ"ではなく"時間帯"を拘束されることの負担は、実際にやっている人にしか分かりにくい部分だと思う。 自動化してからは、朝礼の前にはもうTeamsに一覧が届いている。自分が何時に出社しようが関係ない。この安心感が、削減できた分数よりずっと大きかった。 同じように「たいした時間じゃないから」と我慢している作業がある人は、時間の長さではなく"いつやらなければいけないか"で見直してみるといいかもしれない。 作ったもの 構成はシンプルだ。 Salesforce のレポート(毎日 自動実行) ↓ CSVを添付したメールが届く Power Automate ├ メールを受け取る(差出人と添付で判定) ├ CSVを1行ずつの形に分解する ├ 連携に失敗している行だけを抜き出す ├ 必要な4項目だけを取り出す └ 表の形にしてTeamsに投稿 Salesforceにはレポートを定期実行して結果をメールで送る機能がある。まずこれで毎日CSVが自分宛に届くようにして、そのメールをPower Automateが受け取って処理する、という流れだ。 なぜCSVとメールなのか 見ての通り、かなり古典的なやり方だ。今どきシステム同士を繋ぐならもっとスマートな方法がある。それでもこうした理由は2つある。 ひとつは、Claudeから直接Salesforceを触ることが、この時点ではできなかったこと。以前に社内環境で「何ができて何ができないか」を調べたときの結論がそのまま効いている(詳しくはこの記事に書いた)。 もうひとつは、メール経由なら管理者に頼まずに自分で組めたこと。システム同士を直接つなぐ設定には管理者の権限が要る。一方「レポートをメールで受け取る」「届いたメールを処理する」だけなら、一般ユーザーの権限で完結する。 つまりこれは、制約の中で自分だけで完結させるための選択だった。理想の構成ではないが、動くものが今日できることのほうが大事だと判断した。 ハマった6つの罠 ここからが本題。Power Automateの式を書く部分で、想像の3倍くらい詰まった。同じところで止まる人が絶対にいると思うので、全部書いておく。 罠1:文字化けする 届いたCSVの中身が文字化けした。原因はSalesforce側のCSV出力がShift-JISという古い文字の形式になっていたこと。 解決:Salesforceのレポート設定でエンコードをUnicode(UTF-8)に変更した。処理する側で頑張るより、出す側を直したほうが早い。 罠2:CSVが1行の塊のまま分解できない CSVを行ごとに分けようとしたのに、全部がひと繋がりのまま出てくる。改行で区切っているつもりが区切られない。 原因は改行の正体がCR+LFという2文字の組み合わせだったこと。単純な改行文字で切ろうとしても一致しない。 解決:区切り文字を直接指定する形にした。 split(base64ToString(items('For_each')?['contentBytes']), decodeUriComponent('%0D%0A')) 呪文にしか見えないと思うが、意味が分からなくても問題ない。自分も細部は分かっていない。「CSVが1行にまとまってしまう」ときはこの形と覚えておけば足りる。 罠3:フィルターが全件を通してしまう 「連携に失敗した行だけ」を抜き出したいのに、全部の行が通ってしまう。条件が効いていない。 原因は、CSVの中の値が 0 ではなく "0" だったこと。前後にダブルクォートが付いていて、見た目は同じでも別物として扱われていた。 解決:比較する前にクォートを取り除く。 @and(greater(length(split(item(), ',')), 8), equals(trim(replace(split(item(), ',')[8], '"', '')), '0')) 「見た目は合っているのに一致しない」ときは、たいてい目に見えない何かが混ざっている。前にも列名に改行が紛れ込んでいて同じ目に遭った。この手の問題は本当に気づきにくい。 罠4:Teamsに「True」とだけ届く 通知が動いた。喜んで見たら、Teamsに投稿されていたのは True の1単語だった。 原因は、投稿する内容を選ぶところでメールのHTML本文のほうを間違って選んでいたこと。似た名前の項目が並んでいて、正しいものを選べていなかった。 解決:選択肢の検索欄で「テーブル」と検索して、目当ての出力を選び直した。Power Automateは選択肢が大量に並ぶので、目で探さず検索するのが確実だった。 ...

2026年8月15日 · 1 分