追記を繰り返すと長文になってしまうので、整理して書き直すことにします。
GASを24時間動かしたいのでUrlFetchを使う回数を減らすためにコードは書き直しています。
仮想通貨の3通貨を使ったアビトラのチャンスを伺うために取引所のCoinEXからコインの価格を
取ってきています。
アルトコイン>基軸通貨1>基軸通貨2>元のアルト と交換する場合、交換手数料を含めないとしても
コインの枚数は増減します。仮に2%減った場合は、逆の回し方をして、アルト>基軸2>基軸1>アルト
と回せば増やせると思ってます。
CoinEXの価格データはtradingviewで拾えないのでAPIで直接取るしかないので
dosのbatファイル位しかやったことがなかったのですが、四苦八苦しながら進めています。
##一覧表は大まかにはできました
A列B列 >tickerデータをgetRangeでごちゃごちゃ置いてます。
C 列 >ルート名です ATOM>BTC>BCH だとか ATOM>BCH>BTC といった具合です。
D列~R列 >計算式をいれてます。
S列 >アビトラ開始前のアルトが最終的に何%になったのかを出してます。99.34とあれば0.66%減ることになり
100.5とあれば0.5%増えた という具合です。
U列 >判定列です。S列の値が101.5以上あった場合はメール通知したいので =IF(S6>=101.5,"送信"," ") のように
入れて、送信判定の時は送信というキーワードを表示させ、それ以外は空白にしています。送信というキーワード
がある行の、C,S列を本文としてメールを送信します。 ATOM>BTC>BCH 101.6 といった具合です。
一度に複数行が「送信」判定の場合に1回のメールにする方法があるのかもしれませんが、とりあえず
送信判定数のメールで構わないと思っています。
onEdit? とかでトリガーを指定できるのかもしれませんがやり方がよくわからないので、
トリガーの追加から、スプレッドシートを変更時をトリガーとして設定できるかなと思ってます。
(が まだ試してません。)
##tickerデータを取ってくるコード
function myFunction(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var response = UrlFetchApp.fetch("https://api.coinex.com/v1/market/ticker/all"); var ATOMBTC = JSON.parse(response)["data"]["ticker"]["ATOMBTC"] ss.getRange("A9").setValue(ATOMBTC["buy"]); ss.getRange("A10").setValue(ATOMBTC["sell"]); var ATOMBCH = JSON.parse(response)["data"]["ticker"]["ATOMBCH"] ss.getRange("A11").setValue(ATOMBCH["buy"]); ss.getRange("A12").setValue(ATOMBCH["sell"]); }
こんな感じで調べたい通貨ペアの買値と売値をA,B列に置いてます。
3行目のUrlFetchAppで5000文字以上のデータを一度に取ってきています。
データを一度に取ってからそのresponseを個別にパースしていいのかな?と思ったらできるみたいなので
これで進めようと思ってます。
このmyFunctionは分ベースのトリガーで動かしたいので1日に1440回起動することになります。
ということは1日20000回の縛りに収めるために、5秒ことにループさせてもいいのかなと思います
(が その場合さやが開いてる間、5秒ごとにメールが来てしまいます)
ループさせる場合にSpreadsheetApp.flush();を使うのは前回こちらで教えてもらったので
こうなるのかなと思います。
function myFunction(){ var i = 1 ; while(i <= 13) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var response = UrlFetchApp.fetch("https://api.coinex.com/v1/market/ticker/all"); var ATOMBTC = JSON.parse(response)["data"]["ticker"]["ATOMBTC"] ss.getRange("A9").setValue(ATOMBTC["buy"]); ss.getRange("A10").setValue(ATOMBTC["sell"]); var ATOMBCH = JSON.parse(response)["data"]["ticker"]["ATOMBCH"] ss.getRange("A11").setValue(ATOMBCH["buy"]); ss.getRange("A12").setValue(ATOMBCH["sell"]); SpreadsheetApp.flush() Utilities.sleep(5000) i++ } }
##なんかうまく行かない送信部分
「送信」というキーワードを含む行のC列S列を本文にいれたメールを送信する部分です。
function sendmail() { var ss = SpreadsheetApp.getActive().getSheetByName('シート1'); var lastRow = ss.getLastRow(); var address = 'kkk@gggl.com'; var options = {name: 'アビトラアラート'}; var MailText = rangeC +" "+ rangeS; var subject = "GASからの送信"; for(var i=2; i<=lastRow; i++) { if (ss.getRange(i, 21).getValue() == "送信") { var rangeC = ss.getRange('C' + i).getValue(); var rangeS = ss.getRange('S' + i).getValue(); } } GmailApp.sendEmail(address, subject, MailText,options ); }
これを実行すると、本文とタイトルが「undefined undefined」のメールが1通だけ来ます。
GmailApp.sendEmailの行の前の } を1つ後ろに持ってくると同じメールが8つ程来てから
Exception: 1 日にサービス email を実行した回数が多すぎます。(行 17、ファイル「コード」) というエラー
になりました。
さっきまでは、本文にC列S列が入ったメールが複数ずつ来てたのですが今回はundefinedです。
だんだんわからなくなってきました(汗)24時間sendEmailが使えなくなりました~
回答2件
あなたの回答
tips
プレビュー