Google Workspace割引クーポン無料配布中! 詳しくはこちら

King of Time APIをGASで利用して勤怠データを取得する方法

  • URLをコピーしました!

この記事は、ChatGPTとやり取りを行いながら実際に構築した内容をまとめたものです。

King of Timeの勤務時間をGoogle Apps Script(GAS)を使って取得する方法について解説します。

まず結論からお伝えすると、GASだけではKing of Timeの勤怠データを直接取得することはできません

理由は、King of Time(以下KOT)が提供するAPIに「アクセス元IPアドレス制限」があるためです。

GASは固定IPを持たず、実行のたびに異なるIPから通信する仕組みになっているため、KOTのAPIが認証を拒否してしまいます。

そこで本記事では、Google Cloudの「Cloud Run」を使って固定IPを発行し、
GAS → Cloud Run → King of Time API の流れで勤怠データを取得する方法を紹介します。

最初は少し大変でしたが、同じようにKOTのAPIをGASで扱いたい方にとって参考になるよう、実際にChatGPTに指示した手順・設定順序・動作したコードをまとめました。

同じように困っている方の参考になれば幸いです。

この記事でわかること
  • King of Time APIをGASから利用するための基本構成
  • Cloud Runで固定IPを使ってAPIを中継する方法
  • 勤怠データをスプレッドシートに自動取得する手順
タップできる目次
スポンサー

構成概要

最終的な通信の流れは以下のようになります。

大前提
  ↓ スクショを貼り付ける
GAS(スプレッドシート)
  ↓ HTTPリクエスト
Cloud Run(固定IPのAPIプロキシ)
  ↓ 固定IP経由
King of Time API

この構成により、Cloud Runが「代理サーバー」として固定IP経由でKOT APIにアクセスします。

大前提

まずこの記事の大前提ですが、基本的な流れを入れているだけです。

正直なところ私自身、「再現してください」と言われると、できるかどうか少し不安です。(笑)

私の進め方としては、

  1. ChatGPTに聞く
  2. 今言われている操作が、どの画面のどのボタンなのか分からない
  3. その画面のスクリーンショットでそのまま貼り付け
  4. 「この画面のどこを押せば良いのですか?」「次の手順が分かりません」とChatGPTに聞く
  5. 1〜4の手順を繰り返す

といった形で質問していました。

これをひたすら繰り返してようやくたどり着いた、というのがこの記事の本質です。

このあとに続く内容は、

「大まかな流れとしては、こういう手順で進めましたよ」

という位置づけになります。

大枠のアップまでの流れとしては合っていますが、細かい操作や詳細については実際にご自身で手を動かしながら、その都度 ChatGPT に聞きつつ進めてください。

手順の流れ

(1) Google Cloudプロジェクトを作成

  1. Google Cloud Console にアクセス
  2. 新しいプロジェクトを作成(例:kot-integration-project

(2) 必要なAPIを有効化

次のAPIを順に有効化します。

  • Cloud Run API
  • Cloud Functions API
  • Compute Engine API
  • VPC ネットワーク API
  • Serverless VPC Access API
  • Cloud NAT API

(3) 固定IPアドレスを作成

  1. メニュー → VPC ネットワーク > 外部IPアドレス
  2. 「静的IPアドレスの予約」をクリック
  3. 設定内容
    • 名前:api-proxy-ip
    • 種別:IPv4 / 外部 / リージョン単位
    • リージョン:asia-northeast1(東京)
  4. 「予約」をクリック

これで固定IP(例:203.0.113.25)が発行されます。


(4) Serverless VPC コネクタを作成

  1. メニュー → VPC ネットワーク > Serverless VPC アクセス
  2. 「コネクタを作成」
    • 名前:kot-connector
    • リージョン:asia-northeast1
    • IP範囲:10.8.0.0/28
  3. 「作成」をクリック

(5) Cloud NAT の設定

  1. メニュー → NAT ゲートウェイ
  2. 「NAT ゲートウェイを作成」
    • 名前:kot-nat
    • リージョン:asia-northeast1
    • ネットワーク:default
    • 外部IP:api-proxy-ip
  3. 「作成」をクリック

これで、Cloud Run からの通信が常にこの固定IPを使用するようになります。


(6) Cloud Run にAPIプロキシをデプロイ

  1. メニュー → Cloud Run > サービスを作成
  2. サービス名:kot-api-proxy
  3. リージョン:asia-northeast1
  4. 認証:認証不要(パブリックアクセス可)

index.js

exports.kotProxy = async (req, res) => {
  try {
    const KOT_TOKEN = 'YOUR_KING_OF_TIME_API_TOKEN';
    const base = 'https://api.kingtime.jp/v1.0';
    const path = req.query.path || '/employees';
    const url = new URL(base + path);

    for (const [k, v] of Object.entries(req.query)) {
      if (k !== 'path' && v != null) url.searchParams.set(k, v);
    }

    const r = await fetch(url.toString(), {
      method: 'GET',
      headers: { Authorization: `Bearer ${KOT_TOKEN}` }
    });

    const ab = await r.arrayBuffer();
    const text = new TextDecoder('utf-8').decode(new Uint8Array(ab));

    res.status(r.status)
       .set('Content-Type', 'application/json; charset=utf-8')
       .send(text);
  } catch (e) {
    res.status(500).send(`Proxy error: ${e}`);
  }
};

package.json

{
  "type": "module"
}

(7) Cloud Run のネットワーク設定

設定項目設定値
アウトバウンド トラフィックVPC に接続
コネクタkot-connector
ルーティングすべてのトラフィックをVPCにルーティング

(8) King of Time 側の設定

King of Time管理画面で以下を登録します。

  • アクセス元IP制限に 203.0.113.25 を追加
  • APIトークンを発行(対象API:日別勤怠・従業員情報など)

(9) Google Apps Script(GAS)の設定

const API_PROXY_URL = 'https://kot-api-proxy-xxxxxx.a.run.app'; // Cloud RunのURL

function fetchDailyAttendance() {
  const from = '2025-10-01';
  const to   = '2025-10-07';
  const url  = `${API_PROXY_URL}?path=/daily-workings&from=${from}&to=${to}`;
  const res  = UrlFetchApp.fetch(url);
  const data = JSON.parse(res.getContentText('UTF-8'));

  const header = [
    'date', 'employeeKey', 'divisionCode', 'divisionName',
    'isError', 'assigned', 'unassigned', 'overtime',
    'lateNight', 'breakTime', 'totalWork',
    'telework(min)', 'overtime(min)', 'scheduled(min)', 'absence(min)', 'outing(min)'
  ];

  const CUSTOM_MAP = {
    '0001': 'telework(min)',
    '0002': 'overtime(min)',
    '0003': 'scheduled(min)',
    '0004': 'absence(min)',
    '0005': 'outing(min)'
  };

  const rows = [header];

  data.forEach(day => {
    (day.dailyWorkings || []).forEach(d => {
      const custom = {};
      (d.customDailyWorkings || []).forEach(c => {
        const name = CUSTOM_MAP[c.code];
        if (name) custom[name] = c.calculationResult || 0;
      });
      rows.push([
        d.date || day.date, d.employeeKey,
        d.workPlaceDivisionCode, d.workPlaceDivisionName,
        d.isError === true, d.assigned, d.unassigned,
        d.overtime, d.lateNight, d.breakTime, d.totalWork,
        custom['telework(min)'] || 0,
        custom['overtime(min)'] || 0,
        custom['scheduled(min)'] || 0,
        custom['absence(min)'] || 0,
        custom['outing(min)'] || 0
      ]);
    });
  });

  const sheetName = 'AttendanceData';
  const sh = SpreadsheetApp.getActive().getSheetByName(sheetName)
    || SpreadsheetApp.getActive().insertSheet(sheetName);
  sh.clearContents();
  sh.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
  SpreadsheetApp.getActive().toast(`データ出力完了: ${rows.length - 1}件`);
}

動作確認

  1. スプレッドシートの拡張機能 → Apps Script を開く
  2. fetchDailyAttendance() を実行
  3. 勤怠データが AttendanceData シートに出力されれば成功です。

まとめ

今回は、King of Time APIをGASから利用して勤怠情報を取得する方法を解説しました。

GAS単体では認証が通らないという壁がありますが、Cloud Runを経由して固定IPを使う構成にすることで、安定してデータを取得できるようになります。

設定の手順は少し大変ですが、私自身もChatGPTに

「この画面どこ?」

「ここはどうすればいい?」

と聞きながら一つずつ進めて完成させました。

この記事が同じようにKing of Time APIを使ってみたい方の助けになれば幸いです。

ChatGPTすごいですよ!!

以上、ごすけでした。

ごすけ|生産技術者

1989年生まれの30代。妻と娘の3人家族。
大手メーカーからスタートアップ企業に転職。工程設計の仕事の傍ら、Google Workspaceを使って社内DXを推進中。
Google Workspaceの使い方・DX活用事例をブログで発信しています。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
タップできる目次