見出し画像

GASでGOOGLEFINANCE関数からUSDJPYを取得する簡易APIを作ってみた

経緯

ドルから円に変換する為替レートを取得するAPIを探していたのですが、目星をつけていたYahoo!ファイナンスは数年前にAPIサービスを終了。(有志のサービスはあるようですが、非公式のため一旦使用を断念)
Googleファイナンスは随分前にAPIサービスを終了。それ以外は会員登録が必要で、API使用までに手間がかかりそう。

…というわけで、自分でGoogle Apps Scriptを使ってAPIを作ることにしました。


仕様

  • 日付を指定して取得できるようにする

  • 日付を指定しなくても動作するようにする(指定なしの場合は今日の日付で取得)

  • 為替レート取得時、対象の日付情報も返す


実装

スプレッドシートの準備

シートのB1セルに取得したい日付を書込み、その日付にあう為替レートをA2に記載したGOOGLEFINANCE関数で取得するようにします。
つまり、コードで取得するのはB3セルになります。


コード

スプレッドシートの拡張機能からApps Scriptを開き、コンテナバインド型のスクリプトを作成します。

const FINANCE_SHEET_NAME = "シート1";
const FINANCE_RATE_DEFAULT = 120;
const FINANCE_DATE_RANGE = [12];
const FINANCE_RESULT_RANGE = [32];
const FINANCE_WAIT_TIME_SEC = 2;
const FINANCE_START_DATE = "2000/01/02";

function doGet(e{
  const param = e.parameter;
  
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(FINANCE_SHEET_NAME);
  
  let rate = FINANCE_RATE_DEFAULT;
  let date = new Date(param.date);
  Logger.log(date);
  
  if (Number.isNaN(date.getTime()) || !checkDateIsEnabaleGettingRate(date)) {
    date = new Date();
  }
  sheet.getRange(...FINANCE_DATE_RANGE).setValue(date);
  
  Utilities.sleep(FINANCE_WAIT_TIME_SEC);
  rate = sheet.getRange(...FINANCE_RESULT_RANGE).getValue();

  let out = {
    "date":date,
    "rate":rate
  }

  let out_json = ContentService.createTextOutput();
  out_json.setMimeType(ContentService.MimeType.JSON);
  out_json.setContent(JSON.stringify(out));

  return out_json;
}

/**
 * If the date is the range enable getting rate, return true
 * @param  {date} date
 * @return {boolean} true: enable, flase: disable
 */
function checkDateIsEnabaleGettingRate(date)
{
  const start_date = new Date(FINANCE_START_DATE);
  const end_date = new Date()
  if ((date >= start_date) && (date <= end_date)) {
    return true;
  }
  else {
    return false;
  }
}

GET時、パラメータ「date」に日付を指定することで、その日付をA2セルに書き込み該当の日付の為替レートを返すようにしています。
リターンはJSON形式で「date」「rate」が返るようになっています。

パラメータ「date」に日付以外、または取得できない過去の日付や未来の日付が入っていれば、今日の日付の為替レートを返します。
(試してみたところ、GOOGLEFINANCE関数で取得してる一番古い日付は2000/01/02のようでした)

また日付をスプレッドシートへ書き込んだ後は、関数計算時間を考慮し2秒待つようにしています。
この2秒は暫定的なので、動作の様子をみて変更する予定です。(0秒でも動作はするので、安定性を確認したらこの待ち時間は無しにするかも)


ウェブアプリ公開

デプロイからウェブアプリとして公開します。
私は「ウェブアプリケーションにアクセスしているユーザー」として実行、「Googleアカウントをもつ全員」がアクセスできるように設定しました。

ここの設定は必要に応じて変わると思いますので、参考にされる方は任意の設定でお願いします。
(「Googleアカウントをもつ全員」の場合、スプレッドシートの共有設定を「リンクを知っている全員が編集可能」にしておく必要があります)

デプロイを完了すると、URLが作成されるのでこのURLを開きます。
URLを開いて以下画像のように返れば成功です。

日付を指定する場合、URLの後に「?date=2022-06-06」のように記載すると該当の日付のものが返るようになっています。


最後に

今回は簡易的に作成したため、細かいエラー処理を入れていなかったり、1つしか日付指定ができません。
この記事を参考にされる場合、必要に応じて変更していただければと思います。

また使用上の注意として、複数人で同時に使用すると予期せぬバグを生み出しやすいと思いますので、単数人での利用にしていただくかバグが出ないようにコードを改善してください。

現在は複数日付指定、USDJPY以外の指定などGOOGLEFINANCE関数で指定できるパラメータは全部設定できるようにしたものを作成中です。
またGOOGLEFINANCE関数がエラーを出していないかの確認コードも入れ、使用しやすいAPIに変更していく予定です。

もしまた何か公開できそうなものを作成できたら、公開していきたいな。

いいなと思ったら応援しよう!