Garoon 在席情報 × kintone で「自分の働き方」を共有しよう

目次

はじめに

働き方改革の一環として、オフィスに出社せず在宅やコワーキングスペースで働くリモートワーク制度や、オフィス勤務でも座席が固定ではないフリーアドレス制度など、さまざまな制度が企業に導入されつつあります。
サイボウズでも、オフィス以外で働くメンバーがいたり、営業など席を外すことの多いメンバーはフリーアドレス制を利用して「フリー席」と呼ばれる席で働いています。

そうした場合、気になるのは、チームメンバーが「今日は、オフィス or リモートで働いているのか」「オフィスのどこで働いているのか?」です。

この記事では、Garoon の在席情報と kintone を使って、自分の働き方を自動で共有するカスタマイズを紹介します。

完成イメージ

kintone の「働き方」アプリに登録されているレコードから、その日(曜日)の働き方を Garoon の在席情報の「ステータス」に自動で反映します。

  • 「会社」で働く場合は、固定席かフリー席かを表示します。
    • kintone アプリの「座席番号(固定席の場合のみ)」フィールドに値が入っている場合は、[ステータス]が「固定席」、入っていない場合は「フリー席」と表示します。
    • 「固定席」と表示する場合は、在席情報の[メモ]に、「座席番号(固定席の場合のみ)」フィールドの値を表示します。

システム構成図

Google Apps Script に登録したスクリプトを 1 日 1 回実行し、次のことを行います。
このスクリプトでは、Google Apps Script でログイン情報を設定した cybozu.com ユーザーの Garoon 在席情報のみを更新します。

  • kintone の「働き方アプリ」からログイン名をキーに、働き方レコードを取得します。
  • 取得したレコードを使って、曜日をキーにその日の働き方を Garoon 在席情報に反映します。

下準備

  • kintone および Garoon を利用できるアカウント
  • Google アカウント(Google Apps Script を利用するため)

詳細設定

Garoon

Garoon の在席情報のステータスを追加します(参照: 在席確認:ステータスを追加する (External link)

  1. ヘッダーのユーザー名をクリックし、[個人設定]をクリックします。
  2. [各アプリケーションの管理]タブを選択します。
  3. [在席確認]を選択肢、[ステータスの設定]をクリックします。
  4. 「ステータスの設定」画面で、1 行ずつ「固定席」「フリー席」「自宅」「コワーキングスペース」を入力します。
    入力後、 [設定する]ボタンをクリックして保存します。

注意事項:
このカスタマイズを利用する際は、ステータスの自動設定を無効にしてください。
ステータスの自動設定が有効な場合、1 日の最初に Garoon へログインしたとき、「ステータス」は自動で「在席」に上書きされます。
ステータスの自動設定については、 在席確認:ステータスの自動設定を利用する (External link) を参照してください。

kintone

「社員名簿」アプリと「働き方」アプリを作成します。

社員名簿
  1. アプリストア (External link) の「 社員名簿 (External link) 」アプリをもとに作成します(参考: アプリストアからアプリを追加する (External link)
  2. アプリの設定画面から、「ログイン名」フィールドを追加します。
    フィールド名 フィールドタイプ フィールドコード 備考
    ログイン名 文字列(1行) loginName 「必須項目にする」にチェックします
働き方アプリ
  1. 「はじめから作成」で、アプリを新規に追加します。(参考: アプリをはじめから作成する (External link)

  2. 次のようにフィールドを追加します。

    フィールド名 フィールドタイプ フィールドコード 備考
    社員番号 ルックアップ employeeNumber
    • 「必須項目にする」にチェックします
    • 関連付けるアプリ:社員名簿
    • コピー元のフィールド:社員番号
    • その他のフィールドのコピー:
      • 社員名簿の「氏名」→「氏名」
      • 社員名簿の「ログイン名」→「ログイン名」
    ログイン名 文字列(1行) loginName
    • 「必須項目にする」にチェックします
    氏名 文字列(1行) name
    座席番号(固定席の場合のみ) 文字列(1行) seat
    テーブル Table

    テーブルの内容は次のように設定します。

    フィールド名 フィールドタイプ フィールドコード 備考
    曜日 チェックボックス week
    • 「必須項目にする」にチェックします
    • 以下の項目を追加します
    • 並び:横
    場所 ドロップダウン location
    • 「必須項目にする」にチェックします
    • 勤務場所については、今回は以下の項目を追加します。
      • 会社
      • 自宅
      • コワーキングスペース

Google Apps Script の設定

kintone の「働き方」アプリに登録されたレコードを使って Garoon の在席情報を更新するスクリプトを適用します。
スクリプトを定期実行(1 日 1 回)するよう、トリガーも設定します。

  1. Google App Script (External link) を開き(要 Google ログイン)、[新規スクリプト]ボタンをクリックします。

  2. エディタ部分に 後述のサンプルコード を貼り付けます。

  3. [ファイル]メニューから、[保存]を選択し、保存します。
    適当なプロジェクト名(ここでは「grkin-workstyle」としました)を入力し、[OK]ボタンをクリックします。

  4. スクリプトのプロパティを使って、cybozu.com 環境やユーザー名・パスワードを設定します。
    [ファイル]メニューから、[プロジェクトのプロパティ]を選択します。
    [プロジェクトのプロパティダイアログ]が表示されるので、[スクリプトのプロパティ]タブを選択します。

  5. [行を追加]リンクをクリックし、次のプロパティを入力します。

    プロパティ
    SUBDOMAIN cybozu.com 環境のサブドメインを入力します
    「xxxxx.cybozu.com」の xxx の部分です
    USERNAME cybozu.com 環境にログインするユーザー名を入力します
    PASSWORD cybozu.com 環境にログインするパスワードを入力します
    WORKSTYLE_APP_ID 働き方アプリのアプリIDを入力します

    3 つすべて入力したら、[保存]ボタンをクリックします。

  6. スクリプトの実行タイミングを設定します。
    [編集]メニューから、[現在のプロジェクトのトリガー]を選択します。

  7. [トリガーを追加]ボタンをクリックします。

  8. 次のように設定し、[保存]ボタンをクリックします。

    項目
    実行する関数を選択 「main」を選択します
    実行するデプロイを選択 「HEAD」を選択します
    イベントのソースを選択 「時間主導型」を選択します
    時間ベースのトリガーのタイプを選択 「日付ベースのタイマー」を選択します
    時刻を選択 スクリプトを実行したい時間帯を選択します。
    ここでは「午前7時〜8時」を選択します。

    トリガーが追加されます。

設定は以上です。
「午前 7 時〜8 時」にトリガーを設定したので、毎日午前 7 時〜8 時の間にスクリプトが 1 回実行されます。

動作確認

  1. kintone の「働き方」アプリに、Google Apps Script でログイン情報を設定したユーザーのレコードを登録します。
  2. Google Apps Script の画面で、「関数を選択」リストで「main」を選んで、[▶]ボタンをクリックします。

サンプルコード

以下のソースコードを Google Apps Scripts に貼り付けてください。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * Workstyle share sample program
 * Copyright (c) 2019 Cybozu
 *
 * Licensed under the MIT License
 */

'use strict';

// Google Apps Script のスクリプトのプロパティから設定を取得
const propeties = PropertiesService.getScriptProperties();
const SUBDOMAIN = propeties.getProperty('SUBDOMAIN');
const USERNAME = propeties.getProperty('USERNAME');
const PASSWORD = propeties.getProperty('PASSWORD');
const WORKSTYLE_APP_ID = propeties.getProperty('WORKSTYLE_APP_ID');

/*
 * メイン
 */
function main() {
  const token = Utilities.base64Encode(USERNAME + ':' + PASSWORD);

  // kintone の働き方アプリからユーザーのレコードを取得
  const workStyles = _getWorkStyle(token);

  // 今日の曜日を取得
  const today = new Date();
  const weekNumber = today.getDay();
  const dayOfWeek = ['日', '月', '火', '水', '木', '金', '土'][weekNumber];

  // その曜日に対する働き方情報がなければ、在席情報を更新しない
  if (!Object.hasOwn(workStyles, dayOfWeek)) {
    return;
  }
  const todayWorkStyle = workStyles[dayOfWeek];

  // Garoon の在席情報を更新
  _updatePresence(token, todayWorkStyle);
}

/*
 * kintone からレコードを取得する
 * @param {string} token - 「ログイン名 + ":" + パスワード」を Base64エンコードした値
 * @return {Array.<Object>} レコード一覧
 */
function _fetchKintoneRecords(token) {
  const query = encodeURIComponent('loginName="' + USERNAME + '" order by $id desc limit 1');
  const url = 'https://' + SUBDOMAIN + '.cybozu.com/k/v1/records.json?app=' + WORKSTYLE_APP_ID + '&query=' + query;
  const options = {
    method: 'GET',
    headers: {'X-Cybozu-Authorization': token}
  };
  const resp = UrlFetchApp.fetch(url, options);
  const json = JSON.parse(resp);
  return json.records;
}

/*
 * 働き方情報を取得する
 * @param {string} token - 「ログイン名 + ":" + パスワード」を Base64エンコードした値
 * @return {Object} 働き方情報
 */
function _getWorkStyle(token) {
  // kintone からレコードを取得
  const records = _fetchKintoneRecords(token);

  if (records.length === 0) {
    return '';
  }
  const record = records[0];
  const rows = record.Table.value;

  const workStyles = {};

  // テーブルの内容を、曜日をプロパティに持つオブジェクトに整形する
  // 例:{ '月':{'location':'自宅', 'seat':''}, '日':{'location':'会社', 'seat':'S-001'}, ...}
  rows.forEach((element) => {
    const row = element.value;
    row.week.value.forEach((w) => {
      const workStyle = {
        location: function() {
          if (row.location.value === '会社') {
            if (record.seat.value) {
              return '固定席';
            }
            return 'フリー席';
          }
          return row.location.value;
        },
        seat: function() {
          if (row.location.value === '会社' && record.seat.value) {
            return record.seat.value;
          }
          return '';
        }
      };
      workStyles[w] = workStyle;
    });
  });
  return workStyles;
}

/*
 * Garoon の在席情報を更新する
 * @param {string} token - 「ログイン名 + ":" + パスワード」を Base64エンコードした値
 * @param {Object} workStyle - 今日の働き方
 */
function _updatePresence(token, workStyle) {
  const url = 'https://' + SUBDOMAIN + '.cybozu.com/g/api/v1/presence/users/code/' + USERNAME;
  const body = {
    status: {code: workStyle.location()},
    notes: workStyle.seat()
  };
  const options = {
    method: 'PATCH',
    headers: {
      'X-Cybozu-Authorization': token,
      'Content-Type': 'application/json'
    },
    payload: JSON.stringify(body)
  };
  UrlFetchApp.fetch(url, options);
}

サンプルコードの解説

今回のプログラムのポイントは次のとおりです。

  • 46-56行目
    • 「働き方」アプリから、「ログイン名」フィールドが Google Apps Script のスクリプトのプロパティで設定した USERNAME に一致するレコードを 1 件取得します。
    • UrlFetchApp.fetch (External link) では、GET のときにリクエストパラメーターをつけてリクエストできないため、 複数のレコードを取得する を利用します。
  • 63-101行目
    • 働き方の詳細が記録されているテーブルの中身を使って、曜日のプロパティをもつオブジェクトに整形します。
    • 「場所」フィールドの値が "会社" かつ「座席番号(固定席の場合のみ)」フィールドに値があれば、「固定席」とします。
    • 「場所」フィールドの値が "会社" かつ「座席番号(固定席の場合のみ)」フィールドが空の場合、「フリー席」とします。
  • 108-123行目:

おわりに

今回、固定席の場合は kintone のレコード情報を使って「メモ」に座席番号を表示しました。
手動での設定になりますが、フリー席も在席情報の「メモ」(参照: 在席情報の変更 (External link) )に「xxx の近く」と設定すると、より詳細な情報も伝えることができるのでおすすめです。

このサンプルでは Google Apps Script でログイン情報を設定した cybozu.com ユーザーの Garoon 在席情報のみを更新しますが、コードを書き換えることで「働き方」アプリに設定した全員分の在席情報も更新できます。

利用している API

information

この Tips は、2020 年 3 月版 Garoon と kintone で動作を確認しています。