Office 365を知る参考書(?)

Office 365とかAzureについていろいろ書きたいと思います。別に参考書ではありません。韻踏んでみたかっただけです。

ノンコーディング!Exchange Onlineの予定の場所の近くの○○屋さんをTeamsに自動通知する

この記事はOffice 365のAdvent Calendar 2017に参加しております。
adventar.org


今回のAdvent Calendarは元々Teamsのチーム作成をSharePoint Onlineのワークフロー+Azure Automationで管理者の申請制にしてみよう!という記事を書こうと思ってたのですが、12/19担当の@matkjinさんが同様のアプローチをされていたので、こちらはまた次回ということで・・(記事のリンクはこちらです)

ということで、何書こうかなー?と考え、以前Office 365勉強会でお話させていただいた、打ち合わせ場所の近くの○○屋さんをTeamsに通知する方法をMicrosoft Flowを使った完全ノンコーディングバージョンでお届けしたいと思います。

以前はAzure Functionsを使ったアプローチだったのですが、今回は全てOffice 365の"利用者"でできるものしか使っておりません。(以前のアプローチはこちらのスライドを参照)
〇〇屋さんは皆さんのお好きなものを当てはめてください。(今回も例としてハンバーガー🍔)

それでは初めましょう。

必要なもの

なお、ぐるなびAPIを利用するためにはこちらからアカウントを発行してください。

今回のアプローチ

以下のような流れです。

  1. Exchange Onlineに予定を住所付きで登録 (例)社外打ち合わせ等
  2. 予定が始まる〇分前にFlowが動作する
  3. 住所をGeocodingのAPIに渡し、緯度と経度取得
  4. 緯度と経度をぐるなびAPIに渡し、近くの○○屋さんを取得
  5. 取得した情報をTeamsに通知する
  6. 美味しいお店に行けてハッピー

f:id:takeru55555:20171221190424p:plain

実装してみる

今回はすべてFlow側の実装となります。ちなみに処理をシンプルにするためにエラー処理や例外処理は記述しておりません。例えば住所が空欄の場合や会議室が入っている場合などは別途例外処理を記述する必要がありますのでご注意を。
それでは実装してみましょう。

  • トリガーとして、「予定しているイベントがすぐに開始されるとき」を選択し、以下のように設定。今回は予定の2時間前にFlowが動作するようにしました。

f:id:takeru55555:20171221192856p:plain

  • 次に「HTTP - HTTP」を選択します。Geocodingには以下のよにGETでAPIを叩きます。

http://www.geocoding.jp/api/?q=<住所をエンコードした値>

なお、日本語をエンコードするために、encodeUriComponent 式を利用します。
encodeUriComponent(triggerBody()?['Location']?['DisplayName'])

f:id:takeru55555:20171221193825p:plain

ちなみにこの結果はXMLで返ってきます。

  • 次も「HTTP - HTTP」を選択します。以下のようにGETでぐるなびAPIを叩きます。

http://api.gnavi.co.jp/RestSearchAPI/20150630/?keyid=<発行されたキー>&format=json&input_coordinates_mode=1&latitude=<緯度>&longitude=<経度>&range=3&freeword=<検索ワードをエンコードしたもの>
APIにはいろいろなパラメータが用意されているので仕様書を参考にしていただき色々組み替えてください

なお、緯度と経度はGeocodingの結果であるXMLから値を取り出すために、以下のようにFlowに装備されているxpath式を使います。
緯度
 xpath(xml(body('Http')),'string(/result/coordinate/lat)')
経度
 xpath(xml(body('Http')),'string(/result/coordinate/lng)')

f:id:takeru55555:20171221194955p:plain

こちらはJOSNで返ってきます。

  • 次に「JSONの解析」アクションを使います。実際の応答である「本文」からスキーマを生成することができますが、お店によってはnullのフィールドがあったりすると解析できずエラーとなる場合があります。そこで今回は全店舗で情報を持っているであろう店舗名、URL、住所のみを取るようにしました。

サンプルのスキーマは以下の通りです。

{
    "type": "object",
    "properties": {
        "@@attributes": {
            "type": "object",
            "properties": {
                "api_version": {
                    "type": "string"
                }
            }
        },
        "total_hit_count": {
            "type": "string"
        },
        "hit_per_page": {
            "type": "string"
        },
        "page_offset": {
            "type": "string"
        },
        "rest": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "@@attributes": {
                        "type": "object",
                        "properties": {
                            "order": {
                                "type": "string"
                            }
                        }
                    },
                    "name": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    },
                    "address": {
                        "type": "string"
                    }
                },
                "required": [
                    "@@attributes",
                    "id",
                    "update_date",
                    "name",
                    "name_kana",
                    "latitude",
                    "longitude",
                    "category",
                    "url",
                    "url_mobile",
                    "coupon_url",
                    "image_url",
                    "address",
                    "tel",
                    "tel_sub",
                    "fax",
                    "opentime",
                    "holiday",
                    "access",
                    "parking_lots",
                    "pr",
                    "code",
                    "budget",
                    "party",
                    "lunch",
                    "credit_card",
                    "e_money",
                    "flags"
                ]
            }
        }
    }
}

f:id:takeru55555:20171221195524p:plain

  • 実際のデータが「rest」に格納されるので、後はループを回してTeamsに投稿していくだけです。ここでは「Apply to each」およびTeamsへの「Post message」にて投稿していきます。以下のような感じですね。

f:id:takeru55555:20171221195855p:plain

使ってみる

さて適当な予定を突っ込んで開始に時間前まで待ってみましょう。ちゃんと来ていますね。
f:id:takeru55555:20171221201816p:plain

今回はTeamsのPost messageアクションを使いましたが、少しシンプルすぎるので、もう少し見やすいようにするのであれば、TeamsのWebhookでメッセージを投稿した方が良いかもしれません。

まとめ

さて今回はハンバーガーという私の趣味一直線でしたが、例えばコーヒー屋さんでも良いでしょうし、色々応用が利きます。
Office 365の管理権限なんかも必要ないので、是非お試しください~~~

ではまた次回。

TeamsでChatOps!? TeamsからAzuru FunctionsとAzure Automationで仮想マシンの管理を行なう

先日タイに出張していたのですが、連日30度を越えていて非常に暑かったです。
帰ってきたら20度以上の温度差で少し風邪をひいてしましました。体調管理には気を付けたいものです。

さて今回は思い付きのアイディアを形にしていく自由研究スタイルでいきたいと思います笑
私は検証用にAzureで仮想マシンを動かしておりますが、やっぱり節約しなきゃ!ということで小まめに停止をしております。
ただ毎回Azureのポータルで操作するのってやっぱり面倒くさいですよね。
ということで、TeamsのBot経由でやってしまおう!というのが今日の内容です。今回は仮想マシンの停止のみですが、スクリプトの書き方によってはもちろん仮想マシンの起動や作成、インスタンス変更なんかもできます。すべてはスクリプトの書き方次第でどうとでもなります。
そんなプチChatOps(そんな大それたものではないけれど)が今回のテーマでございます。
Azureを使うのでサブスクリプションが無い方は試用版を取得しておいてください。

やろうとしていること

今回はシンプルに以下のような流れを想定しています。
Microsoft TeamsでBotユーザーに対して特定の文字列(stop-vm)を打つとAzure FunctionsにHTTPリクエストを投げる
②Azure Functionsが起動し、ユーザーに対してメッセージを返すともにAzure AutomationにHTTPリクエストを投げる
③Azure Automationが仮想マシンの停止スクリプトを実行
仮想マシンのシャットダウンが完了したらIncoming Webhookでユーザーに通知

とっても雑な絵ですが、こんな感じ。
f:id:takeru55555:20171207175039p:plain

直接Azure Automationに投げてもできるかもしれませんが、Azure Functionsを経由した方がインタラクティブに対応できますし、これから開始や仮想マシンごとの停止、インスタンスの変更などを考えたときにFunctionsの方が自由度が効くと思ってこうしております。

これを実現するために、以下の準備を行います。

1.一連の処理が終わったら特定のチャネルにメッセージを送信できるようにIncomingWebhookを用意しておく
2.Azure Automationで仮想マシンの停止のRunbookを用意しておく
3.Azure Functionsで関数を用意しておく
4.Teamsにカスタムボットを登録し、Azure FunctionsにHTTPリクエストを投げれるようにしておく

それではそれぞれ見ていきましょう。

1. Teams側でIncoming Webhookを追加しておく

こちらは以前の記事を参照して用意しておいてください。
f:id:takeru55555:20171215004100p:plain

2. Azure AutomationのRunbookを用意する

以下のページを参考に、仮想マシンを操作するRunbookを作成しました。
Azure Automation で VM を自動停止する – Japan Azure Technical Support Engineers' Blog

今回は「Runbook の編集」章で記載がある、「サブスクリプション内の、すべての VM」を停止するようにします。

なお、仮想マシンが停止後、Incoming Webhook経由でメッセージを投げるために、後半のforeach文を以下のようにしております。

foreach ($VM in $VMs) {
    # VM を停止
    $StopRtn = $VM | Stop-AzureRmVM -Force -ErrorAction SilentlyContinue
    $URI = <1. で作成したIncoming WebhookのURL>

    # 正常に VM が停止したかの確認&ステータスの出力
    if ($StopRtn.Status -ne 'Succeeded') {
        Write-Output ($VM.Name + " failed to stop.")
        Write-Error ($VM.Name + " failed to stop. Error was:") -ErrorAction Continue
        Write-Error (ConvertTo-Json $StopRtn.Error) -ErrorAction Continue
        $body = ConvertTo-JSON @{
            text  = $VM.Name + " failed to stop."
        }
    Invoke-RestMethod -uri $URI -Method Post -body $body -ContentType 'application/json'
    }
    else {
        Write-Output ($VM.Name + " has been stopped.")
        $body = ConvertTo-JSON @{
            text  = $VM.Name + " has been stopped."
        }
    Invoke-RestMethod -uri $URI -Method Post -body $body -ContentType 'application/json'
    }

Runbookを保存したら、Webhookを追加します。
Webhookの追加をクリック。
f:id:takeru55555:20171215004207p:plain

任意の名前など必要な設定値を入力して作成。URLが表示されるので控えておいてください。
f:id:takeru55555:20171215004249p:plain

3. Azure Functionsを用意する

今回は全てPowerShellで書こうと思いますので、「PowerShell」-「HTTP - trigger」を選択します。
f:id:takeru55555:20171215004644p:plain

とても簡単ですが、以下のようなものを準備しておきました。

$requestBody = Get-Content $req -Raw | ConvertFrom-Json
$text = $requestBody.text
Out-File -Encoding Ascii -FilePath $res -inputObject $input

$vms = Get-Content $inputTable | ConvertFrom-Json
if($text -like "*stop-vm*"){
    $hash = @{
        type = "message";
        text = "OK. Wait a moment.";
    }
    $URI = <2で取得したAzure AutomationのWebhookのURL>
    Invoke-RestMethod -uri $URI -Method Post -body $body -ContentType 'application/json'
}
else{
    $hash = @{
        type = "message";
        text = "please use the folowing comend.<br>stop-vm -vm 'VM name'";
    }
}
$input = $hash | ConvertTo-Json
Out-File -Encoding Ascii -FilePath $res -inputObject $input

stop-vmコマンドが来たら2で作成したAzure Automationに投げる、それ以外はヘルプ的なものを出す、といった形にしています。

こちらもWebhookを追加します。
f:id:takeru55555:20171215020616p:plain

4. Teams側でカスタムボットを追加する

 チームの管理から「カスタムボットの作成」をクリック
f:id:takeru55555:20171215005629p:plain

3で発行したURLや名前、説明を入力し、作成
f:id:takeru55555:20171215161409p:plain

これで準備が完了です。

さっそく試してみる

それでは登録したBotユーザーに対してStop-VMと話しかけてみましょう。
f:id:takeru55555:20171215015819p:plain

VMがシャットダウンされましたね。
ちなみにStop-VM以外を打つと以下のようにヘルプ的なものが出るようになってます。
f:id:takeru55555:20171215015738p:plain

Azure Functionsはタイムアウトする場合があるので、その辺の考慮は必要ですが、簡単ですし応用も効きます。
是非お試しあれ。

さて次回も自由研究系で何かを書いていこうと思います。

ではまた次回。

Teamsと色々なサービスを連携してみよう。Google Analytics & Power BI編

前回に続きTeamsタブネタ。今日もタブの活用ということで、WebページにGoogle Analyticsを埋め込み、そのデータをPowerBIに繋ぎこみTeamsのタブに表示しましょうという内容です。難しそうに見えてとっても簡単です。
PowerBIを使うので必要なライセンスはご用意ください。私は今回用に試用版を取得しました。

Google Analyticsを埋め込む

ウェブサイトにGoogle Analyticsを埋め込みましょう。
今回は以下のサイトを参考に、はてなブログGoogle Analyticsを埋め込んでみます。

psn.hatenablog.jp

無事埋め込むことができました。

f:id:takeru55555:20171128005159p:plain

PowerBIとGoogle Analyticsを繋ぐ

PowerBIにはGoogle Analyticsのテンプレートがあるので今回はそれを使いましょう。
PowerBIを開き、サービスから「取得」を選択

f:id:takeru55555:20171128010237p:plain

 

一覧から「Google Analytics」を選択

f:id:takeru55555:20171128010331p:plain

 

「今すぐ入手」をクリック

f:id:takeru55555:20171128010419p:plain

 

認証方法を「OAuth2」を選択し、「サインイン」をクリック

f:id:takeru55555:20171128010457p:plain

 

アカウントを選択

f:id:takeru55555:20171128010615p:plain

 

「許可」をクリック

f:id:takeru55555:20171128010718p:plain

 

PowerBIでデータを開くことができました!

f:id:takeru55555:20171128010856p:plain

Teamsにタブとして追加

それでは、Teamsと連携してみましょう。
目的のチャネルに移動し、タブ上の「+」をクリックします。

f:id:takeru55555:20171127205923p:plain

 

アプリの一覧の中から「PowerBI」を選択します。

f:id:takeru55555:20171128012035p:plain

 

追加するダッシュボードをクリックします。

f:id:takeru55555:20171128012104p:plain


タブが追加されました。

f:id:takeru55555:20171128012008p:plain


非常に簡単ですね。
PowerBIで分析したタブをチームで共有する、といった使い方はよくあると思うので、タブとして追加できるのは便利ですね。

今後もタブの追加について書こうと思います。
ではまた次回。

Teamsと色々なサービスを連携してみよう。Trello編

本日もTeamsネタです。Teamsの便利なところはチャットそのものだけでなく、色々なアプリケーションを「タブ」という形で追加できるということもありますよね。
ということで色々なサービスをタブに追加してみようということで、今日はタスク管理として名高いTrelloを追加してみます。

Trelloとは?

まずはTrelloとはそもそもなんだ?ということで、Trelloはポストイット感覚でできるタスク管理ツールで、直感的に操作できるということが特徴です。
個人のタスク管理だけでなく、複数人でタスク管理を行うこともできます。
詳しいことは以下のサイトがわかりやすいかと思います。

seleck.cc

Trelloを使ってみる

私は普段仕事で利用しているので、今回はこの記事用にテストアカウントを取得してみました。
アカウントの取得は、こちらから行ってください。

今回はあるプロジェクトのタスク管理をするための「新プロジェクト」というボードを作成しておき、「ToDo」、「進行中」、「完了」というリストも作成し、適当にカードを並べてみました。

f:id:takeru55555:20171127205517p:plain

用語それぞれの考え方としては、以下のようにお考え下さい。
ボード:ポストイットを張るホワイトボードみたいなもの
リスト:ポストイットのグルーピング
カード:ポストイット

なお、各カードにもチェックリストや、期限、ラベルなどをつけることも可能です。

Teamsにタブとして追加

それでは、Teamsと連携してみましょう。
目的のチャネルに移動し、タブ上の「+」をクリックします。

f:id:takeru55555:20171127205923p:plain

 

アプリの一覧の中から「Trello」を選択します。
f:id:takeru55555:20171127210033p:plain


すでにTrelloにログインしている場合は、ボードの選択画面が表示されますので、追加したいボードを選択します。※ログインしていない場合はログイン画面が表示されるので、ログインします。

f:id:takeru55555:20171127210311p:plain


タブが追加されました。ここからカードの移動や編集も行えます。

f:id:takeru55555:20171127210500p:plain

実際の運用では、プロジェクト用のチャネルを作成し、プロジェクトのタスク管理用のボードをタブに追加するといった使い方でしょうか。
ちなみにTrelloにログインしていないユーザーがこのタブを開こうとすると、以下のようにログインが求められます。

f:id:takeru55555:20171127210840p:plain

 

なお、TeamsにもTrelloのコネクタがあるので、カードが追加された場合や更新された場合に通知する、といったことも簡単にできます。

f:id:takeru55555:20171202165155p:plain

f:id:takeru55555:20171202165331p:plain


また、FlowにもTrelloのコネクタがあるので、もう少し条件を付けたい場合や、他のサービスとも連携させた場合なども色々できますね。

f:id:takeru55555:20171127211656p:plain

f:id:takeru55555:20171127211715p:plainこのようにマイクロソフト以外のサービスと繋げるってのは非常に便利なものです。
ではまた次回。

PowerShell module for Teamsを試してみた。(そして今一歩だと感じた)

最近よくTeamsを触っております。
そんな中でTeams用のPowerShellも色々と試して、ほかのOffice 365系のPowerShellとは大分性格の違うやつだったので、備忘録も兼ねて書こうと思います。
個人的な結論としては今後に期待!という感じだったので、そのあたりも記載します。
なお、このPowerShellは2017/11/24時点でバージョンが0.9.0で、ベータ版のような扱いみたいなので、今後変更される可能性は多々あることをあらかじめご注意ください。

とりあえず使ってみる

1.モジュールのインストール

まず、Teams用のPowerShellを使うためには必要なモジュールをインストールする必要があります。以下のページからインストールしてください。基本的にはSave-Moduleでモジュールの保存、Install-Moduleでモジュールのインストールです。

www.powershellgallery.com

2.コマンドを叩く

さてコマンドを叩いてみましょう。
まずは以下のコマンドにてTeamsに接続します。

Connect-MicrosoftTeams

f:id:takeru55555:20171124213047p:plain

無事接続ができました。次は試しにチームの一覧を取得する以下のコマンドを叩きましょう。ちなみにこのテナントには20個程度のチームがあります。

Get-Team

f:id:takeru55555:20171124213501p:plain

なぜか20個程度あるはずのチームが2つしか取得できませんでした。

ここで少しはまりました。私はこのコマンドはてっきりテナント内のチームを取得するものだと思っていたのですが、実際はPowerShellの実行ユーザーが所有しているチームの一覧を取得するものだったようです。

そもそもTeams用のPowerShellは、他のサービスとは少し考え方が違うようです。
他のOffice 365のPowerShell(Exchange Online,SharePoint Online等)のコンセプトとしては、管理目的で利用するという側面が強かったように感じますが、Teamsの場合少し違っていて、PowerShellの実行ユーザーが画面で操作できることと同様のことをコマンドで利用可能、というもののようです。
チームを取得したり設定したりするコマンドの場合、実行ユーザーが所有しているチームが対象となりますし、チームを作成するコマンドの場合、実行ユーザーが所有者としてチームを作成するという動作となるようです。
また、PowerShellのコマンド自体管理者でなくとも実行できてしまうようです。
ちなみに実行ユーザーはTeamsを利用可能である必要がありますので、Teamsのライセンスが必要です。
簡単に他のPowerShellとの違いを書くと以下のようになります。

Exchnge OnlineやSharePoint Online, MsolServiceなどのPowerShell

管理者にて実行するもの。テナント全体にかかわる設定を実施可能

TeamsのPowerShell

ユーザーでも実行可能。チームやチャネルの作成を実行可能。作成されたチームは実行ユーザーに紐づく。管理者が他のユーザー用のチームを用意したり、テナント全体の設定を変更できるといったものではなさそう。

 

といった感じで、まずそもそものコンセプトが違いますね。
PowerShellは管理目的で使うことが多いので正直う~んというのが率直な感想です。

所感など気づき

上記のようなことからもう一歩というところですね。以下気づいたことを簡単に書きます。

「管理者」としての機能

先ほども書きましたがやはりPowerShellは管理目的で使うというのが一般的な使い方だと思います。テナント内のチームを取得したり、テナントごとの設定を変更したりといった利用方法ができなければPowerShellの利用シーンが少し考えづらいなあと思います。今後テナントの管理という観点で実装されることは非常に期待したいと思います。

画面でできることでよく使う機能は実装してほしい

せめて画面でできることは出来て欲しいものです。そういった観点ですと、既存のOffice 365グループに紐づくチームを作成するといったことはこのコマンドでは出来ないようでした。このあたりも今後に期待する機能です。

まとめ

まとめとしてはやはり今後に期待したい、ということです。まだベータ版なので、正式リリースには期待したいと思います。

ちなみにGraphAPIでもTeamsは管理できるようなので、機会があればこちらも試してみようと思います。

ではまた次回。

番外編!Azureもくもく会@新宿 No.13に行ってみた【まとめと所感】

本日はこちらのもくもく会に参加してまいりました。

azure-mokumoku.connpass.com

ノンコーディングDayということで、メインはLogic AppsとFlowで各々作りたいものを作ろうぜ!という会で、まず自己紹介から始まり、約一時間のもくもくタイム、そして最後に発表したい人は成果発表するという流れでした。
色々と学びと気づきがあったので、簡単にまとめます。

気付き1:Azureとの親和性高し!VMの監視も楽々

成果発表の中にAzureのVMのCPUが閾値を超えたらSlackに通知する、といったものがありました。
Azure Event Gridを使うことで、様々なイベントをトリガーにし、Slackに発砲できるので、Azure上のVMの監視にはもってこいの方法ですね。

docs.microsoft.com

オンプレミスのサーバーをP2VしてAzureのVMを運用している、という会社がどんどん増えている中で、非常に有効な手段であると感じました。

IFTTTやZapierとか同様のサービスが多い中で、Azureと親和性の高いマイクロソフト純正のサービス、というのはLogic Apps/Flowの大きなメリットだと思います。

また、Azure AutomationもAzureの管理には向いているので、こういったものも活用し、ChatOpsを実現する、というのも比較的容易にできるのではないかと感じました。

気付き2:とっても簡単!Cognitive Serviceとの連携

本日の成果発表の中でLogoc AppsからCustom Vision APIComputer Vision APIを使う、というものもありました。(各サービスのURLは下記参照)

azure.microsoft.com

azure.microsoft.com

OneDriveにアップした画像ファイルをComputer Vision APIを使って画像の説明をSlackに投稿するというものや、一部途中ではありましたがPinterestとCustom Vision APIを組み合わせるといったものなどアイディア次第で色々できるんだな~と思いました。

ハンバーガーの画像と組み合わせて何かできないかな?とふと思ったりもしました。

気付き3:ノンコーディングでループも簡単

私が今日取り組んだのがFlow内でのループです。
以前作成した近くのハンバーガー屋さんを探す仕組みのノンコーディング版です。
以前はAzure Functions内でAPIのコールおよびTeams(Slack)に投稿していましたが、今日はFunctionsを使わずにAPIをコールし、取得したJSONをパースしてループする、といったものを実装してみました。

はまったポイントとして、実際の応答からJSONスキーマを生成し、JSONをパース出来るのですが(以下画像参照)、生成されるJSONスキーマと実際の応答のJSONのデータで恐らく多少の差異があったようで、エラーになってしまうということがありました。JSONスキーマを工夫することで、エラーを回避することができました。

f:id:takeru55555:20171117000148p:plain

多少のはまりポイントはあったものの、今回の実装でFunctionsを使わずともノンコーディングで実装することができました。

まとめ

Logic AppsやFlowはアイディア次第で色々と面白いことができそうだなあと思いました。
Cognitive Serviceとの親和性も非常に高く、とても簡単につなぎこみができるので、これからも色々と使ってみようと思います。

ではまた次回。

とっても簡単!Microsoft Flowを使ってハンバーガー関連のツイートをTeamsに投稿する

こんにちは。
唐突ですが、好きな食べ物を食べる瞬間って幸せですよね。私はハンバーガーが大好きなのですが、特に最初の一口目を頬張る瞬間はなんとも素晴らしいものです。

そんなわけで、タイトル通りハンバーガーとTeamsを絡めたことを書こうと思います。
Microsoft Flowを利用し、Twitterハッシュタグに特定のもの(今回は#ハンバーガー)があった場合、Teamsの特定チャネルに投稿する、というものになります。
Microsoft Flowも非常に便利なツールなので、ぜひ活用してみてください。

事前準備

まずはMicrosoft Flowが利用できる環境を準備しましょう。Microsoft FLowは様々なサービスを組み合わせ、自動化ができるサービスで、基本的なOffice 365プランでは利用可能です。(詳細なプランの情報についてはこちらを参照)
似ているサービスとしてはIFTTTやZapierが挙げられますね。

次にTwitterを利用するのでTwitterのアカウントを用意しましょう。

また、Flow経由で投稿するTeamsのチャネルも用意しましょう。今回は以前の投稿作成した「Hamburger」チームの「Cheese Burger」チャネルを利用します。

なお、Microsoft Flowはプランによって実行できる回数が異なるので、多数の実行が予想される場合は注意してください。特に今回のようにTwitterなど、SNSと連携する場合は、ほうっておくとあっという間に上限に達する場合がありますので注意が必要です。

フローを作ってみる。

それではMicrosoft Flowでフローを作ってみましょう。Office 365ポータル等かMicrosoft Flowを開きます。
フローはテンプレートから作ることも可能ですし、一から作成することも可能です。
f:id:takeru55555:20171114235415p:plain

今回はテンプレートから作ってみます。「新しいツイートがハッシュタグと一致したときにMicrosoft Teamsに投稿する」を利用します。

f:id:takeru55555:20171114235300p:plain

連携するサービスのアカウント情報が必要になるので、今回はTwitterのアカウントでサインインします。

f:id:takeru55555:20171115000420p:plain

サインインしたら「続行」をクリックします。

f:id:takeru55555:20171115000756p:plain

 

以下のように検索テキストに任意のテキスト、Team IdとChannel Idにもそれぞれ任意のチーム名、チャネル名を設定し、「フローの作成」-「完了」でフローを保存してください。
f:id:takeru55555:20171115001026p:plain

ここまででフローの作成が完了しました。

Teamsに投稿されるのを待つ

それでは設定したハッシュタグTwitterに投稿されるのを待ちましょう。

以下のようにちゃんと投稿されてますね。(すごい勢いで投稿されておりました。。)

f:id:takeru55555:20171115003415p:plain

有効にしている時間は10分くらいだったのですが、思った以上に実行数が多かったです。(「#ハンバーガー」の実力を少し甘く見てたようですね。。)
先ほども書いたように実行回数には制限があるので、キーワードのチョイスには気をつけましょう。
また、今回のテンプレートの場合、リツイートも投稿されてしまいますので、除外したい場合は条件を書いたり別途考える必要があります。

ちなみにFlow側でも実行履歴を確認できます。

f:id:takeru55555:20171115002844p:plain

とっても簡単ですね。
今回はTwitterを利用しましたが、もちろんほかのサービスとも連携できます。例えばExchange Onlineで特定の送信者からのメールをTeamsに投稿するといったことも簡単に実装できます。また、テンプレートも充実しているので、活用すると非常に便利なサービスです。

TeamsというよりもFlowよりの話になりましたが、今回は以上になります。

今後Teamsと他サービスの連携やチーム作成での運用いったあたりを少し検証しようと思いますので、そのあたりについて投稿しようと思います。

ではまた次回。