メインコンテンツへスキップ
見出し画像
Photo bymilk1234567891

GoogleスプレッドシートとGASでタイムシートを作ったときのこと

    1:導入

    知人から「イベントの時間管理を任されたから、タイムシートを作ってほしい」と頼まれました。
    はじめはExcelで作ろうと思っていたのだけど、話を聞くと知人はExcelを持っていないらしい…。

    じゃあWeb版のExcelで作るか……とも考えたものの、最近 Google Apps Script ってのがあるのを知りました。
    どうやら Google スプレッドシート と組み合わせて VBA みたいに色々できるみたいです。ほかにも他のgoogleの機能とAPIを通じた連携ができるらしいです。(今回は使いませんけど…)

    せっかくなので今回はGASに慣れる練習として、スプレッドシート上で動くタイムシートを使って作ってみることにします。

    2:使用するものたち

    googleスプレッドシート
    Google Apps Script(GAS)

    3:手順①

    とりあえずスプレッドシートにログインをして空白のスプレッドシートで作成します。そうしたら、とりあえずタイムシートっぽい感じに整えてみる。

    画像
    とりあえずそれっぽくセルを整え、チェックボックスを配置したの図

    動作のイメージとしては
    ①イベントAが始まったら、開始の列のチェックボックスにレ点をいれて計測開始…
    ②イベントAの終了を確認したら、終了の列のチェックボックスにレ点をいれて終了
    ③終了時刻、経過時刻をそれぞれの列に自動入力
    ④イベントBも同様に、上記の繰り返し…
    こんな動作のイメージで簡易的に実装を試みる

    スプレッドシートのデザインを決めたらここでいよいよGoogle Apps Scriptを使い始める。

    画像

    拡張機能タブ→AppScriptボタンを押してみる

    4:(問題)AppScriptが開かない

    画像

    あれれ…?
    なぜか開くことができません…

    少し調べてみるとどうやら、「複数のgoogleアカウントでログインした状態」だとこのような画面が出てきてしまうみたいです。
    対処法としては既存のアカウントから、今使うもの以外はログアウトすることだそうです。
    さすがにログアウトをするのは面倒なので、今回は”ゲストモード”にして作業を続けていきます。

    5:手順②

    Google Apps Script を開けたら、エディター画面がでてくるので、ここに以下のコードを貼り付けます。

    function onEdit(e) {
    
      const sheet = e.source.getActiveSheet();
      const range = e.range;
      const row = range.getRow();
      const col = range.getColumn();
      const checked = range.getValue();
    
      // セル取得
      const startTimeCell = sheet.getRange(row, 4);
      const endTimeCell = sheet.getRange(row, 5);
      const elapsedCell = sheet.getRange(row, 6);
    
    
      // 開始チェックON
      if (col == 2 && checked == true) {
    
        // 開始時刻
        startTimeCell.setValue(new Date());
    
        // 前回データ削除
        endTimeCell.clearContent();
        elapsedCell.clearContent();
    
        // 終了チェックOFF
        sheet.getRange(row, 3).setValue(false);
      }
    
    
      // 終了チェックON
      if (col == 3 && checked == true) {
    
        // 開始時刻取得
        const startTime = startTimeCell.getValue();
    
        // 開始前なら終了
        if (!startTime) return;
    
        // 終了時刻
        const endTime = new Date();
    
        endTimeCell.setValue(endTime);
    
        // 経過時間計算
        const elapsed =
          (endTime.getTime() - startTime.getTime())
          / (1000 * 60 * 60 * 24);
    
        // E列へ保存
        elapsedCell.setValue(elapsed);
      }
    
    
      // 開始チェックOFF
      if (col == 2 && checked == false) {
    
        startTimeCell.clearContent();
        endTimeCell.clearContent();
        elapsedCell.clearContent();
    
        sheet.getRange(row, 2).setValue(false);
      }
    }

    JavaScriptの文法がベースになっているので、基本的な知識の範囲でも十分動かすことができそうですね。

    あとはしっかり保存をして、スプレッドシートの画面に戻ります。

    画像

    6:動かしてみる

    では実際に動くか試してみましょう。

    画像
    開始にチェックを入れる

    開始の列のチェックボックスにチェックをつけるとしっかりと開始時刻のセルに時間が表示されていますね。


    画像
    終了にチェックを入れる

    終了にチェックを入れると終了時刻と経過した時間がセルに入っていることが分かります。

    画像
    他の行で動かしても平気そう

    他の行のチェックボックスをしっかりと機能していそうですね

    7:まとめ

    今回は、Excelを持っていない知人のために、GoogleスプレッドシートとGoogle Apps Script(GAS)を使って簡易的なイベントタイムシートを自作してみました。
    Googleアカウントさえあれば、すぐにコードを書き始められる手軽さは非常に良かったです。さすがGoogleさんです。

    今回は1つのシート内で完結するシンプルな動作にGASを使いましたが、導入でも触れた通り、GASは他のGoogleサービスとの連携こそがメインの運用方法だと思います。
    近いうちに何か良いアイディアが思いついたら本格的な運用をしていきたいですね、便利な自動化ツール作りあたりを考えてます…。

     
     
    プログラミング、ソフトウェア開発が好きな個人です。 不意に思いついたもの、作成したもの、プログラミングの備忘録…等々

    あなたへのおすすめ