まえおき
ITの会社でも存在するExcel出勤簿。ついつい付け忘れてて、月末に上司に怒られながら適当な時間入れて申請とかありませんか? そもそもExcel開いて入力・印刷して手書きして~って単純にめんどくさいんですよね。そんなメンドクササを、Office ScriptsとPower Automateで解消してみよーという内容です。
Excelでも、テーブルにできるなら、Power AutomateのExcelコネクターで簡単にデータの登録ができるんですが、非テーブルの勤務表(セル結合とかふんだんに使っているもの)だとそう簡単でもありません。
そこで、Office Scriptsの出番です。 Office Scriptsについては、きぬあささんのブログがとても役立ちます。 (https://www.ka-net.org/blog/?p=12733)
なにをどうしようか
考えるExcel出勤簿はとってもシンプル化して、以下のようなものとします。
今回のスクリプト、フローでは、Power Automateモバイルアプリのボタンを押すと、当日の始業時間・終業時間欄に時刻を記録するというものを作りました。
Office Scripts
スクリプト内で行っているのは、
- 最初のシートを取得
- 日付が入っている列のデータを取得
- forループ内で、セルの値と日付を比較して、一致したらデータ登録
です。
async function main(context: Excel.RequestContext) { let sheet = context.workbook.worksheets.getFirst(); var range=sheet.getRange("B6:B36"); range.load(); await context.sync(); for (let i = 1; i < range.rowCount; i++) { console.log(range.values[i][0]) if(range.values[i][0]==ここに日付){ sheet.getCell(i+5, 6).values = [["ここに時刻をhh:mm形式で"]]; sheet.getCell(i+5, 6).load; await context.sync(); } } }
「ここに日付」と「ここに時刻」とありますが、これらはPower Automate側で与えてあげます。
IF文の中にある、6 という数字は、G列を指しています。退勤の時と出勤の時とで、この箇所も書き換えます。
sheet.getCell(i+5, 6).values = [["ここに時刻をhh:mm形式で"]]; sheet.getCell(i+5, 6).load;
Power Automate
Power Automate側では、
としています。(超簡単) Power Automateから動的にスクリプトを書き換えて実行する方法については こちらの記事 が大変参考になります。
動作確認
ということで動作は以下のようになります。
できた!
— Hiro (@mofumofu_dance) 2020年5月7日
My First #OfficeScripts!! #PowerAutomate から出退勤時間をExcel (notテーブル)に記録する pic.twitter.com/dyxmoHVB04
おわり
テーブルではない規定のフォーマットがあるようなExcel書類に対して自動でデータを登録する場合には、マクロをつかったり、すこし大げさだけどRPAつかったりすると思いますが、 モバイルからの操作性や、クラウドサービスとの連携を考えると、Office Scriptsが使いやすいなと思います。
まだあまり情報が多くありませんが、Previewのうちに触っていると、あとで役立つかもしれません!