Google Data Portalでリモートワーク中の出社状況を可視化してみた

はじめに

はじめまして。asuminです。

みなさん、出社してますか?
私はリモートワークがメインとなり、あまり出社していません。
職場近くのランチのお店が恋しい。。。

それはさておき。
密を回避する目的で出社率をある程度コントロールする必要がでてきたため、私が所属しているTechDivではGoogleスプレッドシートで出社状況を管理しています。
今回はGAS(Google Apps Script)でスプレッドシートに出社状況の集計データを出力し、そのデータをGDP(Google Data Portal※旧GoogleDataStudio)を使って可視化してみたいと思います。

出社状況の可視化フロー

以下のフローで可視化していきます。

  1. GASでスプレッドシートに集計データを出力
  2. GDPで集計データを接続
  3. GDPで接続したデータを可視化

GASでスプレッドシートに集計データを出力

■出社管理スプレッドシートサンプル
 下記のスプレッドシートの集計データを別のスプレッドシートに出力します。

■GASのコード
 下記のGASのコードを実行します。
 ※コードの詳細説明は今回は割愛させていただきます。

// input spread sheet info
const inputSpreadSheetId = '出社表スプレッドシート(集計元)ID';
const inputSheetName = '集計元対象シート名';

// 今日の日付
const targetMonth = new Date();

// output spread sheet info
const outputSpreadSheetId = '集計データ出力先シートID';
const outputSheetName = '集計結果出力シート名';

function main() {
  console.log("start");

  // データ取得
  let spreadsheetData = getCalenderData();
 
  let length = spreadsheetData.length;
  let outputArray = [];
  let dateCount = spreadsheetData[0].length -3;
  
  for (let i = 3; i < length; i++) {
    let name = spreadsheetData[i][2];
    let divName = spreadsheetData[i][4];
    let teamName = spreadsheetData[i][6];
    
    // 名前がないときは除外
    if (!name) {
      break;
    }
    if (divName != "テクノロジー") {
      continue;
    }
     for (let j = 0; j <= dateCount; j++) {
      let tagetDate = spreadsheetData[0][j];
      // 日付がないか、今月の日付でないときは対象外
      if(!tagetDate || !isTargetMonth(tagetDate)){
        continue;
      }
       
      // 出力情報を設定
      let outputRowData = [];
      outputRowData.push(spreadsheetData[0][j]); //日付
      outputRowData.push(divName); //Div名
      outputRowData.push(teamName); // チーム名
      outputRowData.push(name); // 氏名
      outputRowData.push(getType(spreadsheetData[i][j])); //午前
      outputRowData.push(getType(spreadsheetData[i][j+1])); //午前
      outputArray.push(outputRowData); // 1件のデータ追加
      
      j++;
    }
  }
  
  // 今月の日付チェック
  function isTargetMonth(tagetDate){
    let d = new Date(tagetDate)
    return targetMonth.getFullYear() == d.getFullYear() &&
           targetMonth.getMonth()  == d.getMonth()
  }
  
  // 出力内容変換
  function getType(param){
     if(param == "出社")    return "出社";
     if(param == "休")      return "休";
     return "在宅"
  }
  
  // 出力先のスプレッドシートを取得
  let spreadsheet = SpreadsheetApp.openById(outputSpreadSheetId);
  // 出力先のシートを取得
  let sheet = spreadsheet.getSheetByName(outputSheetName);
  if (outputArray.length != 0) {
    if (sheet.getLastRow() != 0) {
      // 出力データを全部削除
      sheet.getRange(2,1, sheet.getLastRow(), sheet.getLastColumn()).clear();
    }
    // 出力データを書き込む
    sheet.getRange(2,1, outputArray.length, 6).setValues(outputArray);
  } else {
    console.error("登録件数が0件です。データを確認してください。");
  }
  
  console.log("end");
};

function getCalenderData() {
  let spreadsheet = SpreadsheetApp.openById(inputSpreadSheetId);
  let sheet = spreadsheet.getSheetByName(inputSheetName);
  return sheet.getRange(1,2,sheet.getLastRow(),sheet.getLastColumn()).getValues();

■出力された集計データのスプレッドシートサンプル
 GASを実行すると下記のフォーマットで集計データが出力されます。

■GASの自動実行設定(トリガー設定)
 毎日データ更新させたいので、任意の時間帯にGASが自動実行されるようにトリガー設定を行います。
 ※ここでは、毎日午前9時台に実行されるようにトリガー設定してみます。

①トリガー(時計アイコン)を選択

②【トリガーを追加】ボタンをクリック

トリガー設定ポップアップ画面が表示されるので、下記の設定を行います。
③『イベントのソースを選択』で【時間主導型】を選択
④『時間ベースのトリガーのタイプを選択』で【日付ベースのタイマー】を選択
⑤『時刻を選択』で任意の時刻を選択※ここでは午前9時~10時を選択
⑥【保存】ボタンをクリック

トリガー一覧にトリガーが新規追加されます。
これで翌日から設定時間帯にGASが実行されるようになります。

GDPに集計データスプレッドシートを接続する

GDPにログインして、下記を実施します
※認証画面については割愛します。
①【作成】⇒【レポート】を選択
②【データのレポートへの追加】で『Googleスプレッドシート』を選択
③ 集計データが出力されたスプレッドシートを選択

レポートの編集画面が表示されます。

GDPで接続したデータを可視化する

ツールバーの『挿入』または、『グラフを追加』から追加したいグラフや表を選択してデータを可視化していきます。
※編集モードになっていない場合は、画面右上の【表示】ボタンをクリックして【編集】に切り替えてください。

A:スコアカード


午前の出社数をスコアカードで表示します。
ツールバーの【挿入】⇒【スコアカード】で編集が可能です。
「データ」と「スタイル」を編集します。


「データ」では下記の通り設定しました。

・指標:出勤(午前)
・デフォルトに日付範囲:カスタム(今日)
 ※比較期間:前の期間
・フィルタ:使用したいフィルタを選択します
 ※該当フィルタがない場合は『フィルタを追加』リンクから必要に応じてフィルタを追加します。
※その他、初期値設定


「スタイル」では下記の通り設定しました。

・比較ラベルを隠す:チェック
・データが欠落:「0」と表示する
・指標名を隠す:チェック
※その他、初期値設定

B:円グラフ


チーム別の出社割合を円グラフで表示します。
ツールバーの【挿入】⇒【円グラフ】で編集が可能です。
「データ」と「スタイル」を編集します。


「データ」では下記の通り設定しました。

・配色:ディメンションの値
・デフォルトに日付範囲:カスタム(今日)
 ※比較期間:前の期間
・フィルタ:使用したいフィルタを選択します
 ※該当フィルタがない場合は『フィルタを追加』リンクから必要に応じてフィルタを追加します。
※その他、初期値設定


「スタイル」では下記の通り設定しました。

・配色:ディメンションの値
・ラベル:割合
※その他、初期値設定

C:縦棒グラフ


チーム別の出社割合を縦棒グラフで表示します。
ツールバーの【挿入】⇒【縦棒グラフ】で編集が可能です。
「データ」と「スタイル」を編集します。


「データ」では下記の通り設定しました。

・期間のディメンション:日付
・ディメンション:チーム
・内訳ディメンション:出勤(午前)
・デフォルトに日付範囲:カスタム(今日)
※その他、初期値設定


「スタイル」では下記の通り設定しました。

・棒グラフ:積み上げ棒グラフ
・配色:ディメンションの値
※その他、初期値設定

D:時系列グラフ


チーム別の出社状況を時系列グラフで表示します。
ツールバーの【挿入】⇒【時系列グラフ】で編集が可能です。
「データ」と「スタイル」を編集します。


「データ」では下記の通り設定しました。

・期間のディメンション:日付
・ディメンション:日付
・内訳ディメンション:出勤(午前)
・デフォルトに日付範囲:自動
※その他、初期値設定


「スタイル」では下記の通り設定しました。

・系列:折れ線
・全般:欠損データ:ゼロとして扱う
・軸:軸を表示
※その他、初期値設定

E:期間設定


表示期間を設定します。
ツールバーの【挿入】⇒【期間設定】でプロパティ編集が可能です。


「データ」では下記の通り設定しました。

・デフォルトに日付範囲:今月


「スタイル」では下記の通り設定しました。

・パディング:上下中央揃え
※その他、初期値設定

F:表グラフ


個人別の出社日数をランキング形式で表示します。
ツールバーの【挿入】⇒【表】で編集が可能です。
「データ」と「スタイル」を編集します。


「データ」では下記の通り設定しました。

・期間のディメンション:日付
・ディメンション:名前
・フィルタ:使用したいフィルタを選択します
 ※該当フィルタがない場合は『フィルタを追加』リンクから必要に応じてフィルタを追加します。
※その他、初期値設定


「スタイル」では下記の通り設定しました。

・表のフッター:ページ設定を表示
・データが欠損:「0」と表示する
※その他、初期値設定

さいごに

GDP(Google Data Portal)はデータ可視化に慣れていなていない私にも、とても使いやすかったです!「データの可視化ってやってみたいけど難しそうだしどうしよう」って悩んでる人にも、おススメです。

業務外ですが、個人的に小ぶりなモンスターをゲットしてGoする位置ゲームをやっているので、モンスター捕獲数・バトル数・目標取得経験値など色々とGDPで可視化して、効率的な経験値UP方法について考察していこうと思います。
目指せ、レベル50!

GASについてはまだまだ勉強不足なので、次回以降はGASの活用について考えていければと思います。