kintoneに定期的に為替レートを記録して、海外経費を海外為替から自動的に円換算してみよう!

著者名:Mamoru Fujinoki( Fuji Business Software Inc. (External link) )

目次

はじめに

Google Apps Script(GAS)の定期実行機能を使えば、外部APIを呼び出し、必要なデータをkintoneに蓄積・保存して利用できます。
今回はGASを使って為替レートのAPIを定期的に呼び出し、最新の為替情報をkintoneに保存します。
さらに、海外経費精算アプリでその為替情報をルックアップして選択し、経費の円換算を自動的に計算するしくみを作ります。

開発の流れ

  • kintoneアプリの作成:為替レートアプリ

  • Google Apps Scriptでの定期実行プログラムの作成

  • kintoneアプリの作成:海外経費精算アプリ

kintoneアプリの作成 : 為替レートアプリ

アプリの設定のフォームタブにて画像を参考に「為替レート」アプリを作成します。

以下のフィールドを追加します。

フィールド名 フィールドタイプ フィールドコード 備考
日付 日付 date レコード登録時の日付を初期値にする
通貨コード 文字列(1行) currency_name
レート 数値 rate
日本円換算 計算 japanese_yen 計算式:ROUND(1/rate),2

「フォームを保存」して、アプリの「設定」画面に移動します。
「APIトークン」をクリックします。

「生成する」ボタンをクリックします。
生成されたAPIトークンの「アクセス権」に「レコード追加」をチェックして保存します。

「アプリを更新」ボタンをクリックして、変更を反映します。
以上でアプリの作成は終了です。

Google Apps Scriptでの定期実行プログラムの作成

Step 1

次のURLを指定して、 https://script.google.com/home/ (External link) Google Apps Scriptのホーム画面を開き、ログイン後、左側メニューの「新しいプロジェクト」の「+」サインをクリックします。

以下の画面が開くので、任意のプロジェクト名、ファイル名に変更します。

Step 2

manifestファイルに、OAuth scopeを記載します。

プロジェクトの設定ボタンから 「appsscript.json」マニフェスト ファイルをエディタで表示する にチェックを入れます。

エディタに戻り、appsscript.jsonに、次のようにOAuth scopeを追加します。

1
"oauthScopes": ["https://www.googleapis.com/auth/script.external_request"],

Step 3

為替レートの取得に今回は、 ExchangeRate-API (External link) を使用します。
サイトより、メールアドレスを入力し、フリープランのAPIキーを取得します。

Step 4

下記を参考にコーディングします。

 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
/*
 * Exchange Ratesを取得する定期実行サンプルプログラム
 * Copyright (c) 2025 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
 */
const exrate_api_url = '{Exchange Rate APIのURL}';// Exchange Rate API リソースURL
const exrate_api_token = '{Exchange RateのAPIトークン}';// Exchange Rate API トークン
const kitone_api_url = 'https://{subdomain}.cybozu.com/k/v1/records.json';// kintone API リソースURL
const kintone_token = '{kintoneアプリのAPIトークン}';// kitone API トークン
const kintone_app_id = {kintoneアプリのID};// kintoneアプリのID
// 為替レートを取得する関数
const fetch_exchange_rates = () => {
  Logger.log('Fetching exchange rates...');
  // GETリクエストを作成
  const options = {
    method: 'get',
    contentType: 'application/json',
    headers: {Authorization: 'Bearer ' + exrate_api_token},
  };
  // GETリクエストを実行
  const response = UrlFetchApp.fetch(exrate_api_url, options);
  Logger.log('Response is "%s"', response.getContentText());
  // 為替レートレコードをkintoneに保存
  send_to_kintone(response.getContentText());
};
// 為替レートのレコードをkinotneに送信する関数
const send_to_kintone = (response_text) => {
  Logger.log('Sending exchange rates to kintone');
  // 為替レートを設定
  const exchange_rates = JSON.parse(response_text).conversion_rates;
  Logger.log('Exchange rates are "%s"', JSON.stringify(exchange_rates));
  const exchange_records = [];
  const targetKeys = new Set(['USD', 'AUD', 'BGN', 'CHF', 'CAD', 'SEK', 'NOK', 'HKD', 'SGD', 'THB', 'CNY']);
  for (const [record_key, record_value] of Object.entries(exchange_rates)) {
    if (targetKeys.has(record_key)) {
      const exchange_rate = {};
      exchange_rate.currency_name = {value: record_key};
      exchange_rate.rate = {value: record_value};
      exchange_records.push(exchange_rate);
    }
  }
  Logger.log('Payload is "%s"', JSON.stringify(exchange_records));

  // POSTリクエストを作成
  const records = {app: kintone_app_id, records: exchange_records};
  const options = {
    method: 'post',
    contentType: 'application/json',
    // JavaScriptオブジェクトをJSON文字列に変換
    payload: JSON.stringify(records),
    headers: {'X-Cybozu-API-Token': kintone_token},
  };
  // POSTリクエストを実行
  const response = UrlFetchApp.fetch(kitone_api_url, options);
  Logger.log('Response is "%s"', response.getContentText());
};

コーディング終了後、保存します。

解説
各定数の設定

Exchnage rate APIのリソースURL、APIキー、kintoneのリソースURLおよびAPIトークン、アプリのIDを定数として設定しています。

1
2
3
4
5
const exrate_api_url = '{Exchange Rate APIのURL}';// Exchange Rate API リソースURL
const exrate_api_token = '{Exchange RateのAPIトークン}';// Exchange Rate API トークン
const kitone_api_url = 'https://{subdomain}.cybozu.com/k/v1/records.json';// kintone API リソースURL
const kintone_token = '{kintoneアプリのAPIトークン}';// kitone API トークン
const kintone_app_id = {kintoneアプリのID};// kintoneアプリのID

Exchange Rate APIのリソースURLには、Base Currencyを日本円にするため、次の値を設定してください。

1
const exrate_api_url = 'https://v6.exchangerate-api.com/v6/latest/JPY';
為替レートの取得

Exchange Rate APIより、為替レートを取得します。 以下のAPI関数で、GETリクエストを実行できます。

UrlFetchApp.fetch(exrate_api_url, options);

1
2
3
4
5
6
7
8
// GETリクエストを作成
const options = {
  method: 'get',
  contentType: 'application/json',
  headers: {Authorization: 'Bearer ' + exrate_api_token},
};
// GETリクエストを実行
const response = UrlFetchApp.fetch(exrate_api_url, options);
為替レートのレコードをkintoneのリクエストデータ形式に変換

Exchange Rate APIより取得したレコードを以下のコードでkintone形式へ変換します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 為替レートを設定
const exchange_rates = JSON.parse(response_text).conversion_rates;
Logger.log('Exchange rates are "%s"', JSON.stringify(exchange_rates));
const exchange_records = [];
const targetKeys = new Set(['USD', 'AUD', 'BGN', 'CHF', 'CAD', 'SEK', 'NOK', 'HKD', 'SGD', 'THB', 'CNY']);
for (const [record_key, record_value] of Object.entries(exchange_rates)) {
  if (targetKeys.has(record_key)) {
    const exchange_rate = {};
    exchange_rate.currency_name = {value: record_key};
    exchange_rate.rate = {value: record_value};
    exchange_records.push(exchange_rate);
  }
}

今回のサンプルでは、以下の為替レートのみ保存しています。

'USD', 'AUD', 'BGN', 'CHF', 'CAD', 'SEK', 'NOK', 'HKD', 'SGD', 'THB', 'CNY'

Exchange Rate APIのレスポンスデータのJSON形式の詳細は Usage Guide (External link) を参照してください。
また、kintoneへ送信するリクエストデータのJSON形式の詳細は 1件のレコードを登録する を参照してください。

kintoneへ為替レートデータを送信

kintone APIのPOSTリクエストを作成します。

1
2
3
4
5
6
7
8
9
// POSTリクエストを作成
const records = {app: kintone_app_id, records: exchange_records};
const options = {
  method: 'post',
  contentType: 'application/json',
  // JavaScriptオブジェクトをJSON文字列に変換
  payload: JSON.stringify(records),
  headers: {'X-Cybozu-API-Token': kintone_token},
};

次のAPI関数でkintoneへデータを送信します。

UrlFetchApp.fetch(kitone_api_url, options);

1
2
// POSTリクエストを実行
const response = UrlFetchApp.fetch(kitone_api_url, options);

次の形式でレスポンスが返ってくれば成功です。

{"ids":["レコードID"],"revisions":["リビジョン番号"]}

1
Logger.log('Response is "%s"', response.getContentText());

Step 5

トリガーの設定画面を表示し、「トリガーを追加」からトリガーを追加します。

以下のように設定し保存します。

  • 「実行する関数」に作成した関数を選択(画面では「fetch_exchange_rates」)
  • 「イベントのソース」として「時間主導型」を選択
  • 「時間ベースのトリガーのタイプ」に「日付ベースのタイマー」を選択
  • 「時刻」に希望の時間帯を設定(画面では「午後1-2時」)

以上でGoogle Apps Scriptの設定は完了です。

kintoneアプリの作成:海外経費精算アプリ

アプリの設定のフォームタブにて画像を参考に「海外経費精算」アプリを作成します。

以下のフィールドを追加します。

フィールド名 フィールドタイプ フィールドコード 備考
申請者 ユーザー選択 applicant
精算日 日付 expense_date
申請内容 文字列(複数行) description
為替 ルックアップ currency 画面の設定を参照
現地為替申請額 数値 local_currency_amount 現地通貨で入力
為替レート 数値 exchange_rate ルックアップで自動設定:単位記号「¥」
日本円換算申請額 計算 amount_in_yen 計算式:local_currency_amount*exchange_rate

ルックアップは以下の画像を参考にしてください。

  • 関連付けるアプリ:為替レート
  • コピー元のフィールド:通貨コード
  • ほかのフィールドのコピー:通貨レート ←[為替レート]日本円換算

計算式は以下の画面を参考にしてください。

  • 計算式:local_currency_amount*exchange_rate
  • 計算式を表示しない:チェック
  • 数値(例:1,000)
  • 単位記号:¥

「アプリを更新」ボタンをクリックして、変更を反映します。
以上でアプリの作成は終了です。

動作確認

為替レートアプリ動作確認

Google App Script https://script.google.com/home/ (External link) のホーム画面を開き、エディタをクリックします。
実行する関数を選択し(画面では、「fetch_exchange_rates」),「実行」をクリックします。

「実行ログ」欄に「実行完了」と表示され、エラーがなければ成功です。

kintoneの「為替レート」アプリにレコードが追加登録されているのを確認します。

海外経費精算アプリ動作確認

kintoneの「海外経費精算」アプリを開き、レコードを新規追加します。

「申請者」、「精算日」、「申請内容」を入力し、「為替」を選択後、「為替レート」が自動表示され、「現地為替申請額」を入力した後、「日本円換算申請額」が自動計算されれば成功です。

まとめ

サンプルのようにGASの定期実行機能を利用してAPIを呼び出し、データの保存先にkintoneを利用すれば、今回の為替レートの計算のようにさまざまな業務用アプリへ応用できます。
株価、天気、各地気温などのAPIと連携することでそれぞれのニーズに応じたkintoneアプリの作成ができます。

参考サイト

information

このTipsは、2025年6月版kintoneで動作を確認しています。