その他

GASで為替レート(為替相場など)が指定した条件を満たしたときにメール通知[No107]

スポンサーリンク

米国株投資を外貨決済で行うために、出来るだけお得にドルを調達し持っておきたいところです。

毎日、為替相場(為替レートなど)でドル 円(USD-JPY/USD/JPY)をGoogle Financeに訪れて確認していましたが、手間なのでプログラムで確認するようにしました。

このプログラムは為替(ドル円など)をチェックし、予め設定した条件に合致したら、通知する処理をします。具体的な設定方法とプログラムを紹介します。

実行イメージ

1.アラート条件の設定

設定シートでは、外国為替の通貨ペアに対する「アラート下限」「アラート上限」を設定しておく。※「レート(円)」は自動で更新されます。

下図の場合は、「USD/JPY」は「132.558」でアラート下限、上限の範囲内のため、プログラムが動作した時は、メールで通知します。

2.ログ出力

3.メール通知

「設定」シートで指定した条件がTRUEであった場合は、下図のようにメール通知します。

準備作業

それでは、準備することを記載します。

スプレッドシートの用意

1.スプレッドシートに前述の「ログ」シート、「設定」シートを作成する。

 シートで登場するキーワードは「No」「外国為替」「レート(円)」「アラート下限」「アラート上限」「USD / JPY」「EUR / JPY」「AUD / JPY」「Date」「instrument price last」です。

2.「設定」シートの「レート(円)」列には「=ROUND(GoogleFinance("currency:USDJPY"),3)」の数式を入力する。

 小数点第3位で四捨五入しています。四捨五入しない「GoogleFinance("currency:USDJPY")」でもOKです。

3.スプレッドシートの「設定」をクリックし、「計算」タブの画面で「再計算」を「変更時と毎分」「変更時と毎時」のどちらかを選択し保存する。

Google Apps Script(GAS)の用意(メイン)

code01、code02、code03を用意したスプレッドシートのApps Scriptで設定する。

notificationExchange関数では「targetArray.push(getTargetPrice('EUR / JPY'));」などをコメントアウトしているが、有効にすれば、それも対象に含まれる。

「【■メールアドレス】」には、送信先のアドレスを記載する。


const notificationExchange = () => {
  try {

    //▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼
    console.log("処理開始(データ取得)");
    // シートを取得
    const logSheet = SpreadsheetApp.getActive().getSheetByName('ログ');

    let nowTime = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss');

    let targetArray = [];
    targetArray.push(getTargetPrice('USD / JPY'));
    // targetArray.push(getTargetPrice('EUR / JPY'));
    // targetArray.push(getTargetPrice('AUD / JPY'));

    let array = [];
    array.push(['Date', nowTime]);
    array.push(['instrument price last', '【' + targetArray.join('】【') + '】']);

    let nameRow = 1;// ヘッダー行を設定
    for (let i = 0; i < array.length; i++) { logSheet.getRange(nameRow, i + 1).setValue(array[i][0]); }

    let lastRow = logSheet.getLastRow();// 最終行を取得
    let lastCol = logSheet.getLastColumn();// 最終列を取得
    for (let i = 0; i < array.length; i++) { logSheet.getRange(lastRow + 1, i + 1).setValue(array[i][1]); }

    console.log("処理完了(データ取得)");
    //▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲

    //▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼#####▼
    console.log("処理開始(条件判定&メール通知)");

    // シートを取得
    const settingSheet = SpreadsheetApp.getActive().getSheetByName('設定');

    lastRow = settingSheet.getLastRow();// 最終行を取得
    lastCol = settingSheet.getLastColumn();// 最終列を取得

    let hitArray = [];
    for (let a = 0; a < targetArray.length; a++) {

      let list = settingSheet.getRange('A' + '1' + ':' + getColName(lastCol) + lastRow).getValues();
      let targetPrice = targetArray[a][list[0].indexOf('レート(円)')];
      let targetLowerLimit = targetArray[a][list[0].indexOf('アラート下限')];
      let targetUpperLimit = targetArray[a][list[0].indexOf('アラート上限')];

      if ((targetPrice >= targetLowerLimit) && (targetPrice <= targetUpperLimit)) {
        hitArray.push(targetArray[a]);
      }
    }

    if (hitArray.length > 0) {
      const recipient = '【■メールアドレス】';
      const subject = 'メール件名' + '(' + nowTime + ')';
      const body = '【' + targetArray.join('】\n【') + '】';
      const options = {};
      GmailApp.sendEmail(recipient, subject, body, options);
      console.log("メール送信:対象");
    }
    else {
      console.log("メール送信:非対象");
    }

    console.log("処理完了(条件判定&メール通知)");
    //▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲#####▲

  } catch (err) {
    console.log(err);
  }
}

参考サイト/関連サイト(getTargetPrice関数について)

【GAS GoogleAppsScript - スプレッドシート】特定の列をキーとしてデータを取り出す!

【GAS】 スプレッドシートの項目(カラム)位置の可変に対応できる列指定


const getTargetPrice = (search) => {
  try {

    // シートを取得
    const settingSheet = SpreadsheetApp.getActive().getSheetByName('設定');

    let lastRow = settingSheet.getLastRow();// 最終行を取得
    let lastCol = settingSheet.getLastColumn();// 最終列を取得

    let list = settingSheet.getRange('A' + '1' + ':' + getColName(lastCol) + lastRow).getValues();

    let targetCol = list[0].indexOf('外国為替');

    let keys = settingSheet.getRange(getColName(targetCol + 1) + '1' + ':' + getColName(targetCol + 1) + lastRow).getValues();
    keys = keys.flat();// 配列を1次元に変換

    let target = list[keys.indexOf(search)];
    return target;
  } catch (err) {
    console.log(err);
  }
}

参考サイト/関連サイト(getColName関数について)

【Google apps Script】数字をアルファベットに変換するとか - kokamoto的外部記憶装置


const getColName = (x) => {
  try {
    let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    let ret = str.slice(x - 1, x);
    return ret;
  } catch (err) {
    console.log(err);
  }
}

スポンサーリンク

備考

Google Financeをスクレイピングして価格を取得するにはParserライブラリを追加して、以下のコードを用意しておけば可能です。

参考サイト/関連サイト(getStockPrice関数について)

GASでスクレイピングする方法!Parserライブラリを利用した手順を解説

GASで日本株式・株価を取得する方法を解説!個別株と上場投資信託の基準価格も


function getStockPrice() {
  let code = "USD-JPY";
  let url = "https://www.google.com/finance/quote/" + code;
  let html = UrlFetchApp.fetch(url).getContentText();
  let stockPrice = Parser.data(html)
    .from('<div class="YMlKec fxKbKc">')
    .to('</div>')
    .build();
  console.log("為替:" + stockPrice);
}

備考

私はトリガーを為替取引が行われる日だけに設定しておいたほうがいいと思うので、月曜日から土曜日まで毎日、8時、12時、16時、21時に起動するようにしています。

設定方法は以下で紹介しています。

no image
GASで特定時間に自動実行するようにトリガーをセットする(正規表現で月・日・曜日で範囲指定)[No106]
タイトルの通りです。プログラムと設定方法を紹介します。 Google Apps Scriptの用意 Google Apps Script(GAS)の用意 function setTr ...

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

-その他