ファビコン。井の家紋。GASで株価の取得やトリガの設定、自動メール送信などについて | エクセルマクロ(VBA)実践蔵(じっせんぐら)

前の項目 - Outlookマクロで迷惑メール、スパムメール、フィッシングメールの一括削除
次の項目 - VBAから外部アプリのEdgeやChromeをSendKeysやSendMessage、keybd_eventで操作するマクロ

GASで株価の取得やトリガの設定、自動メール送信などについて最終更新日:2024-07-11

Google Spread Sheetで株価を取得するコードや、トリガを設定する方法、自動メール送信について記述していきたいと思います。

GASで今日の株価を取得する

今日の株価を取得するコード。GAS版。ただし、使用しているGETPRICEは、別サイト様のものなので、GETPRICEの環境構築についてはネットで検索してみてください。セルから呼び出すのは重たいので、GASのコードでループさせて取得するコードです。毎日15時に起動タイマを設定しておくと自動でその時間に実行してくれます。

下記コード内の"XXX"部分については、SpreadSheetのIDを指定します。取得方法についてはGASの基本 開いていないブックのID取得方法を参照してください。

下記、画像のC列は手動で入力しています。コードを実行することで更新されるのは、D列になります。コードが参照しているのが、B列です。

getRange(開始行数,開始列数,取得行数,取得列数)を指定し、getValues()を呼び出せば、まとめて取得できます。下記のコードでは、3行目,2列目から最終行、3列のデータを指定しています。なので、B列からD列の3行目~最終行までの範囲を指定していることになります。

最終行取得の注意事項は、過去に100行目まで使用していて、行削除ではなく、セル内データの削除を行い、実際の最終行が10行程度しかないように変更した場合でも、最終行を100行と認識される場合があります。そのため、空セルの場合にどうするか、考慮が必要です。そのため、下記コードでは、実データがあるかを確認して、ある場合にGETPRICEを呼び出しています。空っぽセル(配列データ)を見つけたら、「break;」でループを終了するようにしてもいいと思います。

注意事項:Googleを無料で使用しているアカウントには連続実行時間に制約があります。あまり、たくさんの株価の取得をしようとするとタイムアウトすることになります。その場合、テーブルを分けて実行することで動作できます。ただし、1日の中でも実行時間上限があるため、それも注意してください。

実行方法がわからない方は、関数を指定して実行する方法を参照してください。

GASで今日の株価の取得

 
function getMyBook(){
let Book = SpreadsheetApp.openById("XXX");

return Book;
}
function GetCodePrice()
{
let Book = getMyBook();
let Sheet = Book.getSheetByName("シート1");
let lastRow = Sheet.getLastRow();
let DataRange = Sheet.getRange(3,2,lastRow,3); // B3セルからD列最終行セルが編集範囲
let 株データ = DataRange.getValues();
var date = new Date();
let 曜日 = date.getDay();

if( 曜日 != 0 && 曜日 != 6 )
{ // 0は日曜日、6は土曜日 それ以外の曜日のときに実行する

// 取得日を設定 B1セル
Sheet.getRange(1,2).setValue(Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss'));

for(let cnt=0; cnt < 株データ.length; cnt++ )
{
if( 株データ[cnt][0] != "" && isFinite(株データ[cnt][0]) )
{ // 数値か判定
株データ[cnt][2] = GETPRICE(Number(株データ[cnt][0]));
}
}
DataRange.setValues(株データ);
}
}

GASでトリガをコードで設定する方法

下記のコードは、実行されると、実行した日の15時に'GetCodePrice'が自動実行されます。初期関数なら'myFunction'と関数名を指定することで、指定時刻に指定関数が呼び出されます。

毎日自動でトリガを設定する場合、GASでトリガを手動で設定する方法の設定も参照してください。

トリガの時間設定。コードで組む方法。

 
function setTrigger(){

//Dateオブジェクトで実行した時間を取得
let time = new Date();
//setHours,setMinutesでトリガー登録したい時間を設定
time.setHours(15);
time.setMinutes(00);

//newTriggerメソッドでtriggerTestを特定日時でトリガー登録
ScriptApp.newTrigger('GetCodePrice').timeBased().at(time).create();
//デフォルトの関数ならScriptApp.newTrigger('myFunction')
}

GASでトリガを手動で設定する方法

手動でトリガを設定する方法。

コードを記述している画面の左端にあるアイコン一覧から、トリガを選択する。

GASトリガメニュー

トリガを追加し、設定する。毎週や毎日や毎時などが選択できる。

GASトリガメニュー

毎日15時ぴったりという設定はできません。「15時~16時」という設定ならあります。

「15時~16時」トリガ設定で問題ない方は、この方法だけで良いのですが、時間ぴったり指定したい場合は、GASでトリガをコードで設定する方法と組み合わせます。

例えば、上の手動設定で毎日朝に「setTrigger」関数が自動実行されるように設定しておくと、「setTrigger」関数によって、その日の15時に「GetCodePrice」関数が実行される、という2段がまえになります。

GASでメールの自動送信

GASでは、気軽にメール送信も行えます。宛先をセルから取得するなら、「Sheet.getRange("A1").getValue();」とかでも取得できます。(Sheetオブジェクト変数がSheetの場合)

 
//送信者は、ログインしているGoogleアカウントのメールアドレスからです。
//引数 Tableは 二次元配列です。
function sendMail(Table) {

let to = "XXX@XXXX"; //宛先、どこでも
let subject = "件名:GASからの通知";
let body="";

for(let i=0; i for(let j=0; j
if( Table[i][j] != ""){
body = body + Table[i][j] + " ";
}
}
body = body + "\n";
}

GmailApp.sendEmail(to, subject, body);
}

メール送信の使用例。

 
//使用例
function GetCodePrice()
{
//上で記述しているので他のコードは省略

sendMail(株データ);
}

これで、毎日同じ時刻に株価のデータがメールとして受信できます。

前の項目 - Outlookマクロで迷惑メール、スパムメール、フィッシングメールの一括削除
次の項目 - VBAから外部アプリのEdgeやChromeをSendKeysやSendMessage、keybd_eventで操作するマクロ