有休アップデートをさらにアップデートした話

こんにちは!
インターンの桑原です。

あっという間に2月です。

時がたつのは早いもので、毎日の業務時間を有意義なものにできるように、気を入れ直して頑張ろうと思っております。

さて、本日は前回の有給休暇管理のアップデートをさらにアップデートした話を共有します。

前回のおさらい

前回のアップデートでは、

  • 表を見やすくわかりやすく整理
  • 2019年4月より適応される有休に関する法律に適応
  • 新しい会期で自動的に表を作成

ということを叶えました。

今回の課題

この表は社員全員の有休消化時間の管理のためにあるものです。

つまり、当然、各社員それぞれその時間を管理するスプレッドシートが存在します。

というわけで、有休管理者はその各社員が管理するシートに存在する、有休消化時間をコピーし、この管理シートにペーストする作業が生じます。

現在社員数が17名属しているため、これを地道にやると結構めんどくさいですよね。

そこで今回この作業を自動化しようと立ち上がりました。

目指せ!入力作業の自動化!

今回このような完成図を描きながら、作業を進めました。

各スプレッドシートの有休消化時間が書かれたセルの値を吸い取って、有休管理表に反映させることが目標です。

前提は以下の通りです。

・スプレッドシートはGoogle App Script(GAS)にて開発された当社自社サイトより、規則性をもってファイル名が名付けられます。
・ その各ファイルの内容は同様であり、有休消化時間は決まったセルに記入されます。

この数値を、有給休暇管理表の順番通り、設置していきます。

したがって完成したコードは以下の通りです。

 

桑原
これを書きあげたとき、得も言われない達成感に充ち溢れました。

動作の順序

上記の図より、プログラミングとして機能するために、このようにしてみました。
(上記のコメントアウトとほぼ同じです)

  1. 社員のUser名を配列データとして格納
    ( このとき、有給休暇管理表の1行目の右から順にユーザー名を格納した配列を作成)
  2. 各ファイル名を生成し、配列データとして格納
    (作業月報_社員のUser名_先月末(YYYYMMDD))
  3. 各ファイル名より、各スプレッドシートのIDを取得し、配列データとして格納
  4. 取得した各ファイルのIDをもとに、各ファイルを開いて、指定のセルから数値を取得し、配列データとして格納
  5. 取得した数値は1次元配列であるため、2次元配列化
  6. 現在開いており、吸い取った数値を反映させたいスプレッドシートを指定
  7. 記入する月の行に記入できるように、前月の記入した行を調べ、その次の行に値をセット

文章にすると少しわかりづらいですが、こんなことを上記のコードたちは実現しています。

また⑦について図解するとこのようになります。

ぶち当たった壁と解決への過程

これを書きあげるまで、何度もつまづきました。

なぜならばGoogle App Script(GAS)のもとであるJavaScriptの知識がほぼなかったからです。

そんなわたしに立ちはだかった壁は以下の通りです。

  1. Logger.logがうまく使いこなせません
  2. 配列って何ですか。
  3. 配列を使った繰り返し表現forEachを使っても繰り返されないんですが……。
  4. 先月をどう指定しますか。
  5. 各スプレッドシートのIDが取得できないです
  6. 全然できない、諦めようかな。
  7. いや、がんばれ桑原。
  8. なんかスクリプトがごちゃごちゃしていて見づらい
  9. なんとか各スプレッドシートのIDを取得してデータの出力がログでは出力されているのに、表に反映できません……。

途中はただの嘆きのようですが、実際に自分との闘いもありました。

今回とくに1番大変だったのは、配列の扱い方でした。

桑原
配列とは?

という初歩の初歩から始まり、配列の性質とやりたいことをすり合わせていくのが大変でした。

最初は、1つの配列を利用し、そこで繰り返される処理をすれば、動作の順序にある①~⑤の作業が繰り返されるものだと考えていました。

しかし、何度やってもそんな風に動いてくれないGAS。

そんな中で、mapメゾットに出会い、配列の中身を書き換えて更新していくような書き方を思いつきました。

こうすることで、配列が書き換えられて最終的に欲しかった各ファイルの特定のセルの数値までたどり着くことができました。

桑原
ここを自力でクリアできたことが大きかったです。

この後、取得した配列データをどう扱うという点も非常に難しかったですが、無事解決し、なんとか理想通り実装することができました!

まとめ

今回もGoogle先生に尋ねまくり、先人の素晴らしい功績を参考にしながら、なんとか解決策を見出しました。

さらに社内でメンターとして関わってくださる社員の方にもいろいろとアドバイスをいただきながら、なんとか走り抜けることができたと思います。

本当にいつもありがとうございます!

このように、
「各スプレッドシートから情報を取って反映させる」
ということができると、いろいろと応用が利きそうです。

これをもとに、他にも自動化ができるよう、いろいろと奮闘してみたいと思います。

参考資料

Google Apps Scriptでファイル名、フォルダ名からファイルへアクセスしたい – Qiita
JavaScript で値を文字列化する短いコード
JavaScriptの配列の使い方まとめ。要素の追加,結合,取得,削除。 – Qiita
【初心者向けGAS】スプレッドシートのセル範囲の値を二次元配列として取得して取り扱う方法
【GAS】エラー「ArrayをObject[][]に変換できません。」に遭遇したら・・・ – Qiita
【GAS】特定列の最終行の次の空セルに値をセットする – インフルエンサー
Google Apps Script – GASで各スプレッドシートよりセルの情報を集める|teratail