SlideShare a Scribd company logo
ファイルではない
Excel on OneDrive
Profile
システム構築のプロセス評価、改善、策定、開
発フレームワークの設計、実装管理、プリセー
ルスやプロジェクトの立ち上げなど
ブログ :http://blog.processtune.com
プロフィール :Facebook, Twitter or MVP
コミュニティ :.NETラボの運営スタッフ
Microsoft MVP :Developer Technologies
OneDriveにExcelを置く目的
Excelアプリケーションを使ってExcelファイルを開く必要があるか?
2021/3/27
OneDriveのデータ操作の一例
2021/3/27
Power Automate
経理システム Outlook
Teams
OneDrive
for Business
Excel
経理部 マネージャー 経費申請者
ダウン
ロード
しない
Kaizala
経費が上長に承認さ
れていることの確認
と経費集計ができれ
ばいい
経費を申請したい
だけなのにExcel
ファイルをダウン
ロードしたくない
管轄の経費を承認
したいだけなのに
Excelファイル開き
たくない
実装の準備
経費申請業務を実装する仕組みを確かめる
2021/3/27
交通費精算・経費精算等のフォーマット
Download Excel template file from Office.com
Office.comサイト-テンプレート-経費報告書:
https://templates.office.com/ja-jp/%E7%B5%8C%E8%B2%BB%E5%A0%B1%E5%91%8A%E6%9B%B8-TM04099206
テンプレートをアップロード
After a few modify, then upload the file to your OneDrive.
る
/me/drive/root:/経費明細書.xlsx
る
/me/drive/root:/経費明細書.xlsx
同じ数(各
列の行数)
の配列で構
成されてい
る
する
/me/drive/items/{driveitemid}/workbook/worksheets(‘{シート名}’)/range(address=‘{シート
名}!B1:L22')
POST /me/drive/items/{driveitemid}/versions/{versionid}/restoreVersion
→204 No Content(成功の場合)
シートの構成を確認する
/me/drive/items/01WKVNWXSNBWFX2ANLDNCIRKJKHQV7SB4K/workbook/worksheets
セルの構成を確認する
/me/drive/items/01WKVNWXSNBWFX2ANLDNCIRKJKHQV7SB4K/workbook/worksheets/経費明細書/usedrange
セルの構成を確認する
/me/drive/items/01WKVNWXSNBWFX2ANLDNCIRKJKHQV7SB4K/workbook/worksheets/経費明細書/usedrange
る
/me/drive/root:/経費明細書.xlsx
ユーザーインターフェイス
サーバーレス
コンピューティング
永続化層
他システム
Power Automateで業務フロー
2021/3/27
まず3人の役割(経理、マネージャー、申請者)を分け
ない
App launcher icon-> すべてのアプリ-> Power Automate
トリガーの定義
Power Automate-> 作成-> 自動化されたフロー-> onedrive-> ファイルが変更されたとき*上の方
トリガーの定義
Power Automate-> 作成-> 自動化されたフロー-> onedrive-> ファイルが変更されたとき-> Root
Excelファイルの読み込みを定義
新しいステップ-> Excel Online -> 表内に存在する行を一覧表示
Excelファイルの読み込みを定義
表内に存在する行を一覧表示-> OneDrive for Business-> OneDrive-> 経費明細書
Excelファイルの読み込みを定義
表内に存在する行を一覧表示-> OneDrive for Business-> OneDrive-> 経費明細書-> ExpenseData
Excelファイルの読み込みを定義
表内に存在する行を一覧表示-> OneDrive for Business-> OneDrive-> 経費明細書-> ExpenseData
データ処理を定義する
新しいステップ-> 制御-> Apply to each
データ処理を定義する
新しいステップ-> 制御-> Apply to each-> value-> アクションの追加-> データ操作
データ処理を定義する
新しいステップ-> 制御-> Apply to each-> value-> アクションの追加-> データ操作-> 作成-> 合
計
データ処理を定義する
新しいステップ-> 制御-> 条件-> 出力
データ処理を定義する
新しいステップ-> 制御-> 条件-> 出力-> 式-> int() -> int(出力)*出力=output(‘作成’)
データ処理を定義する
新しいステップ-> 制御-> 条件-> 出力-> 式-> int(…) 次の値より大きい 0
データ処理を定義する
新しいステップ-> 制御-> 条件-> はいの場合-> アクションの追加-> Microsoft Teams
データ処理を定義する
Microsoft Teams-> メッセージを投稿する(V3)-> チーム-> マイコネクション(アカウント選択)-
> 選択する
データ処理を定義する
メッセージを投稿する(V3)-> チャンネル-> 選択する(一般:General) -> (前の作成の)出
力を選択
データ処理を定義する
新しいステップ-> アクションの選択-> 制御 -> 終了を選択
データ処理を定義する
終了を選択-> 状態-> 成功 ->テスト-> トリガーアクションを実行する-> 保存&テスト
データ処理を定義する
OneDrive上のExcelに金額を入力-> 式が入っていて合計金額が変化する-> ファイルの変更でフ
ローが流れる
データ処理を定義する
実行結果を確認-> 各ステップの中を確認-> Apply to eachの場合、各処理を個別に確認可能
データ処理を定義する
実行結果を確認-> 各ステップの中を確認-> Apply to eachの場合、各処理を個別に確認可能-> 次
へ
Web app作成
2021/3/27
プログラムでフォーマットする
Teams-> チームを選択-> チャンネル(一般:General)/ Kaizara-> チャット
コントローラーの追加
Visual Studio-> .NET Core Web App-> Controller-> HomeControllerにメソッド追加
ビューの作成
Visual Studio-> .NET Core Web App-> Views-> Home-> Index.chtmlにコントロールをいくつか
追加
発行
Visual Studio-> 発行-> Azure Web App
動作確認
ブラウザ-> 確認
Power Automateにアクション追加
アクションの追加-> 組み込み-> HTTP -> HTTP
HTTPアクションの追加
アクションの追加-> 組み込み-> HTTP -> HTTP -> GET -> URI -> クエリ-> input & type
ステップの修正
HTTPアクションをドラッグ&ドロップ
マット
メッセージの修正
保存とテスト
OneDriveのファイルを変更し、TeamsとKaizalaで動作を確認
• ファイルを扱うのでなく情報を扱うという視点
Microsoft Graph API
• Google driveやBoxなどのファイルを扱う必要がある場合
ExcelDataReader
• 管理画面でアップロードされたファイルを事前チェックしたい場合
Open XML
ファイルを直接読みたいケースとは?
Open XML sample code
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
public async Task<IActionResult>
UploadSingle(IFormFile file){
//file save
// lastFile = getFile()
}
Open XML sample code
using (SpreadsheetDocument document = SpreadsheetDocument.Open(lastFile.FullName, false))
{
var wbPart = document.WorkbookPart;
var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
foreach (var sheet in wbPart.Workbook.Descendants<Sheet>())
{
…
Open XML sample code
var wsheetPart = wbPart.GetPartById(sheet.Id) as WorksheetPart;
if (wsheetPart != null)
{
if (sheet.Name == "○○一覧")
{
var ws = wsheetPart.Worksheet;
foreach (var row in ws.Descendants<Row>())
{
…
Open XML sample code
if (row.RowIndex == 1)//表タイトル
{
foreach (Cell cell in row)
{
//タイトル取得など
}
}
else
{
//表本体の処理
Open XML sample code
foreach (Cell cell in row)
{
var value = cell.InnerText;
//表本体の処理
}
Conclusion
OneDriveはファイルサーバーとして使わない方がいい
◦ ファイルをダウンロードしてメールに添付する仕事のやり方は変わります
◦ レガシーな仕事のやり方だと…同じファイルが複数存在する、バージョン管理が煩雑になる、セキュリティ的に問題
◦ 組織アカウント+OneDriveの組み合わせは���細かなアクセス制御ができます
◦ ノーコード Or プログラムでもOK。Excelファイルを入力に使って、入力された情報だけを必要な人に流すことが可能
◦ OneDriveはバージョン管理ができます
◦ 過去のバージョンにも復元できるので「yyyyMMddファイル名.xlsx」みたいなファイルを大量に作る必要はない
OneDriveのファイルを使う場合
◦ Graph APIは、Open XMLアーキテクチャやExcelDataReader名前空間を使うより楽です
◦ Open XMLアーキテクチャやExcelDataReaderを使うのは、OneDriveのGraph APIを使えないときに使います
セッション中のプログラムについて
◦ Blog.Processtune.comにて情報を公開していきます。github.com/TetsuroTakaoでも情報公開します。

More Related Content

Excel on OneDrive is not a file

Editor's Notes

  1. このセッションではMicrosoft Graph APIやPower Automate、Open XMLアーキテクチャを使ったExcelの操作を説明します。 ただし、ソースコードの解説だけならインターネット上にサンプルコードはたくさんありますから、ここでは現実の運用に即した運用手順の組み立て方のコツなどもお話しします。
  2. はじめに自己紹介させてください。【読む】本日のお話はIgnite the tour Osakaで話した内容の更新版となります。
  3. OneDriveにファイルを置く目的は「情報の共有」であり、「情報の共同編集」であり、「情報の保管」かもしれません。しかしながら、それを行うためにファイルという入れ物は、私は必要ではないと考えています。ファイルという入れ物に入れて情報システム部門でアクセス権を管理し、破棄ポリシーが無いままファイルサーバーが電子のゴミ箱みたいになっている状態を何度も見たことがあります。皆さんも同じではないでしょうか?MicrosoftはTeamsでExcelファイルを共同編集できるようにしました。OneDriveでは同じようにブラウザで共同編集できます。 これによって、ファイルをファイルサーバーからダウンロードして電子メールに添付して共有するといった作業は必要なくなりました。
  4. それでは実装の準備から進めましょう。
  5. まず、Office.comから経費報告書をダウンロードしてきて、これをテンプレートにするので、そのままOneDriveにアップロードします。
  6. 次に、日本語がおかしいところがあるので少々修正します。アップロードの時に気を付けていただきたいのがアカウントです。このファイルを操作するのは経費の申請者、承認者、経理部です。これまでのActive Directoryのアクセス権設定では、これまでのシステムと変わりません。例えば、複数の部署でのプロジェクトでプロジェクトマネージャーが主幹の部署の部長だったとします。その部長はプロジェクトの経費を承認できなければいけません。しかし、多くのケースではプロジェクトマネージャーの部署ではないメンバーの経費は、そのメンバーの組織上の上長が形式的に判を押し、それをもってプロジェクトマネージャーが承認するといったことが行われます。つまり、プロジェクトメンバーでない組織上の上長がプロジェクトの経費内容を知ることになります。多くの組織では権限上問題ないかもしれませんが、セキュリティ上は問題があります。 それぞれの運用を考慮したアカウントの設計が必要になります。
  7. これを、Graph Explorerでみるとこんな感じです。これが初期の内容になりますから、このExcelファイルを初期化する際(誰かが入力して、情報の共有が終わったら)このJSONで上書きしてしまえばよいということですね。
  8. そのため最初にこれをUTF-8で保存して、プロジェクトのルートに入れておきます。プロジェクトは何でも良いのですが私はASP.NET Core のMVC Webアプリケーションを使っています。
  9. または、OneDriveはバージョンを保持していますので、手動で行う「復元」についてもMicrosoft Graph APIを通してリクエストすることができます。
  10. Power Automateを定義する前に、このブックの構成を確認しておきます。
  11. 中身を見ると、明細エリアの日付フィールドが空白だったら空白を表示して、期間を表示しています。【クリック】
  12. また、各行の小計、各列の小計を出して最後に合計を出してますので、これらのセルはデータとしては必要ありません。
  13. Microsoft Graph APIを使うとExcelをファイルでなくユーザーインターフェイスとして使えるので、クライアントにはOfficeアプリケーションが必要ないという運用ができます。MacやAndroidを端末として使えるという利点もあります。
  14. 中身の確認が終わったらPower Automateで業務フローを作りましょう。ここでは、簡単に同じアカウントで業務の流れだけを先に作ってしまいます。
  15. 作成の流れはこんな感じです。【スライドを読む】ステップごとに解説します。ステップは3つだけです。各ステップの詳細を見ていきましょう。
  16. 経費明細書の置き場は便宜的にルートに置いてありますが「ファイルが変更されたとき」の対象はフォルダーになります。ですから、フォルダ内のファイルが変更されるごとにイベントが流れます。 ここでまず最初の設計の分岐を迎えます。イベントを全部拾って、必要なものだけを後続処理に流すのか?フォルダーを経理部と申請部署と分けるのかといった設計です。 王道はありません。入力の都度入力の検証を行うのがいいのか、入力完了の最後に検証を行うのかといった視点もありますし、入力の中断、レジューム機能を持たせたいとか、できる限り流れるイベント数を抑えたいといった視点もあります。 ここでは一例として、あるセルが変更されたらイベントを流すようにします。つまり、「申請者が申請送信したら」とか、「マネージャーが承認したら」というイベントドリブンを例にします。自動化されたフローを選択、名前を入力してonedriveを検索します。
  17. リストの最下部に「ファイルが変更されたとき」のOneDrive for Businessは2つあります。上はフォルダルートの変更をトリガーします。下はサブフォルダまで監視します。上を選んで作成をクリックすると次の画面で監視対象のフォルダーを選択することができます。
  18. ファイルが変更された時に対象のExcelファイルを読みます。「新しいステップ」をクリックし、Excel Online Businessを選んで「表内に存在する行を一覧表示」を選択します。
  19. 場所、OneDrive for Business、ドキュメントライブラリ、OneDrive、ファイル、経費明細書.xlsxを選択していきます。
  20. Office.comの経費明細書には、計算の為の��前定義がしてあるのでそれを使います。テーブルに、ExpenceDataを選択し、最後に保存します。
  21. エクセルファイルで名前を選択するとデータを取得できる範囲が分かります。ここに入力されたデータが配列で後続処理に流れてくるというわけです。
  22. 次に流れてきたデータを処理します。流れてくるデータというのは、先ほどの配列データです。配列を処理する場合は、制御処理アイコンを選択してApply to eachを選択します
  23. 入力ボックスをクリックして下に出てくる表示からvalueを選択します。続いてこの中から合計(各列の)が入っていればその行に入力があることがわかるので、まず合計だけ抜き出します。うまく動いたら各行の項目を追加していけばいいと思います。そのためまず「データ」と入力するとデータ操作アイコンが一番左に表示されるようになり、クリックすると下のリストにデータ操作関係のアクションが一覧されます。
  24. データ操作のリストから作成を選択し、入力ボックスをクリックすると項目を選ぶことができます。合計を選んで、合計が0円でなかったらTeamsに投稿するアクションを作ります。
  25. アクションの追加をクリックし、制御アイコンが表示されているので、アイコンを選択すると下に選択リストが表示されます。一番上の条件を選択し左の値の選択をクリックすると入力補助の画面が表示されます。注意が必要なのですが、データはすべて文字で受送信されます。ですから、ここでは数値に変換してから0円でないところだけ抜き出します。
  26. まず、式を選択して変換関数の中からint(value)を選択します。次にintの()の間にカーソルを当ててから動的コンテンツを選択してください。そこで出力を選択します。
  27. これで、作成のアウトプット、つまりエクセルの表の中の合計列の配列が数値型に変換されて後続処理に流れるようになりました。この後0円でないものだけTeamsに書き込まれるようにします。
  28. はいといいえでそれぞれ何をやるのかが定義できますから、はいの方にだけTeamsへの書き込みを定義します。はいの方でアクションの追加をクリックするとTeamsアイコンが選べるようになっています。
  29. Teamsアイコンをクリックし、メッセージを投稿する(V3)(プレビュー)をクリックするとチームやチャンネルを選べるようになります。右肩の3点リーダーをクリックするとチームやチャンネルを選ぶ際にそのアカウントが登録されているチームやチャンネルを選べるようになりますので複数のアカウントとの接続を持っている方は、対象のアカウントを選んでおいてください。チームにはそのアカウントが登録されているチームがリストに出ますので選択してください。
  30. 同様にチャンネルでGeneralを選んで本文に出力を選択します。
  31. 最後にApply to eachの下の新しいステップで制御から終了を設定します。
  32. 処理としては成功を返すように設定しておき、テストからトリガーアクションを実行するを選んでから保存&テストをクリックします。
  33. 燃料費に700円を入力すると、合計には式が入っていますので合計は0円ではなくなります。Teamsの画面に出力されたことでもフローが流れたことを確認できますし、Power Automateの画面でもフローが成功したことを確認できます。
  34. ここまで作ってしまえば、Teamsで結果を確認しながらフローを拡張していくことができます。 たとえば、結果画面のApply to eachをクリックし、条件をクリックするとどのような処理結果だったかがわかります。この場合、Excelからは11行分のデータが流れてきて1件目が0円以上だったことがわかります。次へをクリックすると【クリック】
  35. 結果はfalseになっており2行目が0円だったことがわかります。
  36. Power Automateで業務フローの動作確認が取れたら簡単なWebアプリを作りましょう。
  37. この例はKaizaraにも同じ通知を飛ばしています。Teamsの方もKaizalaの方も日付がおかしくなっていること、金額がフォーマットされていない事がわかると思います。 Excelファイルは日付データをOADateという型で値を保存してますから、これを.NETなどで扱いやすい型に変えてやる必要があります。このような処理は、Power Automateでやるのではなく、小さなプログラムを作ってPower Automateから利用する方が効率が良いかと思います。
  38. プログラムは非常にシンプルです。このような関数をHomeControllerに作成して、値段の場合は「ToString(“C”, new CultureInfo(“ja-jp”))」、日付の場合はDateTime型のFromOADateで変換して返してあげます。
  39. まず、Web App側で動作チェックを行うために簡単なページを作ります。ローカルでも確認できますし、Azureに発行してもかまいません。
  40. Power Automate側でポートを指定するのが面倒だったのでFreeプランのF1でAzure側に機能を発行しました。
  41. まず、Web App側で動作チェックをします。
  42. Web側で動作チェックができたらPower Automate側を作成します。 HomeコントローラーにConvertValueを追加したので条件の下にアクションを追加、HTTPを追加します。
  43. 日付と金額を変換します
  44. 次に条件を開けて、はいの箱にHTTPをドラッグアンドドロップします。このようにアクションはどこに入れても修正できるので試行錯誤しながら正しく動くフローを作ってください。
  45. はいの箱にHTTPを並べたらTeamsのメッセージを修正してKaizaraのアクションも追加します。
  46. 動作を確認します。
  47. 情報はセキュアにアクセスすべきで、セキュアとは組織のコンプライアンスに強く紐づくものです。つまり、Excelファイルの情報にはそのファイルにアクセスできる人間がアクセスできるように制御されている必要があり、認証は必須です。認証と認可が統制的に紐づいているMicrosoft 365という情報基盤はGoogle driveやBoxなどファイル制御中心に利用されているストレージサービスとは異なります。 OneDriveをファイルサーバーとして使っている以上、Google driveやBoxに対する優位性を享受することはできません。
  48. おそらく、OpenXML自体がわからないと、ハンセルマンのExcelDataReaderの使いどころがわからないと思いますので、簡単にOpenXMLを説明します。