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にアクセスします。
大前提
まずこの記事の大前提ですが、基本的な流れを入れているだけです。
正直なところ私自身、「再現してください」と言われると、できるかどうか少し不安です。(笑)
私の進め方としては、
- ChatGPTに聞く
- 今言われている操作が、どの画面のどのボタンなのか分からない
- その画面のスクリーンショットでそのまま貼り付け
- 「この画面のどこを押せば良いのですか?」「次の手順が分かりません」とChatGPTに聞く
- 1〜4の手順を繰り返す
といった形で質問していました。
これをひたすら繰り返してようやくたどり着いた、というのがこの記事の本質です。
このあとに続く内容は、
「大まかな流れとしては、こういう手順で進めましたよ」
という位置づけになります。
大枠のアップまでの流れとしては合っていますが、細かい操作や詳細については実際にご自身で手を動かしながら、その都度 ChatGPT に聞きつつ進めてください。
手順の流れ
(1) Google Cloudプロジェクトを作成
- Google Cloud Console にアクセス
- 新しいプロジェクトを作成(例:
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アドレスを作成
- メニュー → VPC ネットワーク > 外部IPアドレス
- 「静的IPアドレスの予約」をクリック
- 設定内容
- 名前:
api-proxy-ip - 種別:IPv4 / 外部 / リージョン単位
- リージョン:
asia-northeast1(東京)
- 名前:
- 「予約」をクリック
これで固定IP(例:203.0.113.25)が発行されます。
(4) Serverless VPC コネクタを作成
- メニュー → VPC ネットワーク > Serverless VPC アクセス
- 「コネクタを作成」
- 名前:
kot-connector - リージョン:
asia-northeast1 - IP範囲:
10.8.0.0/28
- 名前:
- 「作成」をクリック
(5) Cloud NAT の設定
- メニュー → NAT ゲートウェイ
- 「NAT ゲートウェイを作成」
- 名前:
kot-nat - リージョン:
asia-northeast1 - ネットワーク:
default - 外部IP:
api-proxy-ip
- 名前:
- 「作成」をクリック
これで、Cloud Run からの通信が常にこの固定IPを使用するようになります。
(6) Cloud Run にAPIプロキシをデプロイ
- メニュー → Cloud Run > サービスを作成
- サービス名:
kot-api-proxy - リージョン:
asia-northeast1 - 認証:認証不要(パブリックアクセス可)
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}件`);
}
動作確認
- スプレッドシートの拡張機能 → Apps Script を開く
fetchDailyAttendance()を実行- 勤怠データが
AttendanceDataシートに出力されれば成功です。
まとめ
今回は、King of Time APIをGASから利用して勤怠情報を取得する方法を解説しました。
GAS単体では認証が通らないという壁がありますが、Cloud Runを経由して固定IPを使う構成にすることで、安定してデータを取得できるようになります。
設定の手順は少し大変ですが、私自身もChatGPTに
「この画面どこ?」
「ここはどうすればいい?」
と聞きながら一つずつ進めて完成させました。
この記事が同じようにKing of Time APIを使ってみたい方の助けになれば幸いです。
ChatGPTすごいですよ!!
以上、ごすけでした。


