質問編集履歴

2

コードを整理して本文も書き直しました

2020/07/28 12:23

投稿

khalipon
khalipon

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,163 +1,199 @@
1
+ 追記を繰り返すと長文になってしまうので、整理して書き直すことにします。
2
+
1
- 仮想通貨のアービトラージ(裁定取引)の機会がどのくらあるチェックたいと思っています。
3
+ GASを24時間動かしたいのでUrlFetch使う回数を減らすためにコードは書き直しています。
2
4
 
3
5
 
4
6
 
5
- 取引所からの各コインの価格データスプレッドシートに取り入れ、それを
7
+ 仮想通貨の3通貨を使ったアビトラのチャンスを伺うために取引所のCoinEXからコインの価格を
8
+
9
+ 取ってきています。
6
10
 
7
11
 
8
12
 
13
+ アルトコイン>基軸通貨1>基軸通貨2>元のアルト と交換する場合、交換手数料を含めないとしても
9
14
 
15
+ コインの枚数は増減します。仮に2%減った場合は、逆の回し方をして、アルト>基軸2>基軸1>アルト
10
16
 
11
- 仮想通貨のめぼしい銘柄を、基軸通貨を間に2つ挟んで同一取引所内での3通貨に交換した場合、
12
-
13
- どのくらいの頻度でさやが発生するのかを調べたいのですが
14
-
15
- 例えばATOM>BTC>BCH>ATOM だとかXRP>BCH>BTC>XRPといったいくつかの
16
-
17
- ルートでの減率を調べます。
17
+ と回せばやせると思ってます。
18
18
 
19
19
 
20
20
 
21
- 上記ATOM>BTC>BCHル場合、
21
+ CoinEX価格デタはtradingviewで拾えないでAPIで直接取るしかないので
22
22
 
23
- A1セルにルート名として"ATOM-BTC-BCH"と記入
24
-
25
- B1セルからN1まで、取引所ら取得しそれぞれ通貨の価格を取得し枚数を順番に計算して
23
+ dosのbatファイ位しやったことがなたのですが四苦八苦ながら進めいます。
26
-
27
- O1セルに最終的なATOMの枚数を%でみちびいたとします。99.75%だとしたら0.25%減ったことになりますし
28
-
29
- 100.5%だとしたら0.5%増えたのだとします。
30
24
 
31
25
 
32
26
 
27
+ ##一覧表は大まかにはできました
28
+
29
+ A列B列 >tickerデータをgetRangeでごちゃごちゃ置いてます。
30
+
31
+ C 列 >ルート名です ATOM>BTC>BCH だとか ATOM>BCH>BTC といった具合です。
32
+
33
+ D列~R列 >計算式をいれてます。
34
+
35
+ S列 >アビトラ開始前のアルトが最終的に何%になったのかを出してます。99.34とあれば0.66%減ることになり
36
+
37
+  100.5とあれば0.5%増えた という具合です。
38
+
39
+ U列 >判定列です。S列の値が101.5以上あった場合はメール通知したいので =IF(S6>=101.5,"送信"," ") のように
40
+
41
+  入れて、送信判定の時は送信というキーワードを表示させ、それ以外は空白にしています。送信というキーワード
42
+
43
+  がある行の、C,S列を本文としてメールを送信します。 ATOM>BTC>BCH 101.6 といった具合です。
44
+
45
+  一度に複数行が「送信」判定の場合に1回のメールにする方法があるのかもしれませんが、とりあえず
46
+
47
+  送信判定数のメールで構わないと思っています。
48
+
49
+  onEdit? とかでトリガーを指定できるのかもしれませんがやり方がよくわからないので、
50
+
33
- UrlFetchは1回実行で13回程に抑え分ベーのタイマで1分ごとにトリガーさせようと思ます。
51
+  トリガー追加から、スプレッドシートを変更時をトリガーとして設定できるかなとってます。
52
+
53
+  (が まだ試してません。)
34
54
 
35
55
 
36
56
 
37
- ここまでは出来たのですが、O列であ一定以上の数値、たとえば101%以上になった時
57
+ ##tickerデータを取ってくコード
38
58
 
59
+ ```
60
+
61
+ function myFunction(){
62
+
63
+ var ss = SpreadsheetApp.getActiveSpreadsheet();
64
+
65
+ var response = UrlFetchApp.fetch("https://api.coinex.com/v1/market/ticker/all");
66
+
67
+ var ATOMBTC = JSON.parse(response)["data"]["ticker"]["ATOMBTC"]
68
+
69
+ ss.getRange("A9").setValue(ATOMBTC["buy"]);
70
+
71
+ ss.getRange("A10").setValue(ATOMBTC["sell"]);
72
+
73
+ var ATOMBCH = JSON.parse(response)["data"]["ticker"]["ATOMBCH"]
74
+
75
+ ss.getRange("A11").setValue(ATOMBCH["buy"]);
76
+
77
+ ss.getRange("A12").setValue(ATOMBCH["sell"]);
78
+
79
+ }
80
+
81
+ ```
82
+
83
+ こんな感じで調べたい通貨ペアの買値と売値をA,B列に置いてます。
84
+
39
- にアラート送信するようしたのでがどのようにすればよいのかわかりません
85
+ 3行目UrlFetchAppで5000文字以上のデ一度取ってきてす。
86
+
87
+ データを一度に取ってからそのresponseを個別にパースしていいのかな?と思ったらできるみたいなので
88
+
89
+ これで進めようと思ってます。
40
90
 
41
91
 
42
92
 
43
- たとえばO1が101%に、A1ート名 "ATOM-BTC-BCH" 、そてO1値 "101%" をメールの本文して、メールのタイトルは
93
+ myFunctionは分ベスのリガーで動かたい1日に1440回起動するこになります。
44
94
 
45
- ”価格アラト”とし送信した
95
+ ということは1日20000回の縛りに収めるために、5秒ことにルプさせいのかなと思いま
46
96
 
97
+ (が その場合さやが開いてる間、5秒ごとにメールが来てしまいます)
47
98
 
99
+ ループさせる場合にSpreadsheetApp.flush();を使うのは前回こちらで教えてもらったので
48
100
 
49
- コード.gsなの
101
+ こうかなと思いま
102
+
103
+ ```
50
104
 
51
105
  function myFunction(){
52
106
 
53
- SpreadsheetApp.getActiveSpreadsheet().getRange("C1").setValue( JSON.parse(UrlFetchApp.fetch("https://api.coinex.com/v1/market/ticker?market=ATOMBTC")) ["data"]["ticker"]["last"]);
107
+ var i = 1 ;
54
108
 
55
- SpreadsheetApp.getActiveSpreadsheet().getRange("G1").setValue( JSON.parse(UrlFetchApp.fetch("https://api.coinex.com/v1/market/ticker?market=BCHBTC")) ["data"]["ticker"]["last"]);
109
+ while(i <= 13) {
56
110
 
57
- SpreadsheetApp.getActiveSpreadsheet().getRange("K1").setValue( JSON.parse(UrlFetchApp.fetch("https://api.coinex.com/v1/market/ticker?market=ATOMBCH")) ["data"]["ticker"]["last"]);
111
+ var ss = SpreadsheetApp.getActiveSpreadsheet();
58
112
 
59
- SpreadsheetApp.getActiveSpreadsheet().getRange("C2").setValue( JSON.parse(UrlFetchApp.fetch("https://api.coinex.com/v1/market/ticker?market=XRPBTC")) ["data"]["ticker"]["last"]);
113
+ var response = UrlFetchApp.fetch("https://api.coinex.com/v1/market/ticker/all");
60
114
 
61
- SpreadsheetApp.getActiveSpreadsheet().getRange("K2").setValue( JSON.parse(UrlFetchApp.fetch("https://api.coinex.com/v1/market/ticker?market=XRPBCH")) ["data"]["ticker"]["last"]);
115
+ var ATOMBTC = JSON.parse(response)["data"]["ticker"]["ATOMBTC"]
62
116
 
63
- }
117
+ ss.getRange("A9").setValue(ATOMBTC["buy"]);
64
118
 
65
- の下に付け加えるように、
119
+ ss.getRange("A10").setValue(ATOMBTC["sell"]);
66
120
 
67
- function sendNotification() {
121
+ var ATOMBCH = JSON.parse(response)["data"]["ticker"]["ATOMBCH"]
68
122
 
69
- }
123
+ ss.getRange("A11").setValue(ATOMBCH["buy"]);
70
124
 
71
- 等といった形で記述していくのでしょうか?
125
+ ss.getRange("A12").setValue(ATOMBCH["sell"]);
72
126
 
127
+ SpreadsheetApp.flush()
73
128
 
129
+ Utilities.sleep(5000)
74
130
 
75
- こちらを見ると>> https://teratail.com/questions/155111#_=_
131
+ i++
76
132
 
77
- function onEdit(e) {
78
-
79
- }
133
+ }
80
-
81
- となっており、それが理にかなっているような気もしています。
82
-
83
-
84
-
85
- どなたかアドバイスよろしくお願いいたします。_(._.)_
86
-
87
-
88
-
89
-
90
-
91
- 追記です
92
-
93
- あれからいろいろ参考にしながら試しています。
94
-
95
-
96
-
97
- P1に "=IF(O1>=100.5,"送信","false")" と入れて、O列の値が0.5%以上のさやが開く時に
98
-
99
- 「送信」判定を入れるするようにしました。
100
-
101
-
102
-
103
- その上で下記のコードを入れ、送信 という文字の入った行のA列、O列の値をメール本文として
104
-
105
- 送信するようにしました。
106
-
107
-
108
-
109
- function sendmail() {
110
-
111
- var ss = SpreadsheetApp.getActive().getSheetByName('シート1');
112
-
113
- var lastRow = ss.getLastRow();
114
-
115
- var address = 'aaa@bbb.com';
116
-
117
- var options = {name: 'アビトラアラート'};
118
-
119
-
120
-
121
- for(var i=2; i<=lastRow; i++){
122
-
123
- if (ss.getRange(i, 16).getValue() == "送信"){
124
-
125
- var rangeA = ss.getRange('A' + i).getValue();
126
-
127
- var rangeO = ss.getRange('O' + i).getValue();
128
-
129
- }
130
-
131
-
132
-
133
- var MailText = rangeA +" "+ rangeO;
134
-
135
- var subject = "GASよりメール送信";
136
-
137
- GmailApp.sendEmail(address, subject, MailText,options );
138
134
 
139
135
 
140
136
 
141
137
  }
142
138
 
139
+ ```
140
+
141
+ ##なんかうまく行かない送信部分
142
+
143
+ 「送信」というキーワードを含む行のC列S列を本文にいれたメールを送信する部分です。
144
+
145
+ ```
146
+
147
+ function sendmail() {
148
+
149
+ var ss = SpreadsheetApp.getActive().getSheetByName('シート1');
150
+
151
+ var lastRow = ss.getLastRow();
152
+
153
+ var address = 'kkk@gggl.com';
154
+
155
+ var options = {name: 'アビトラアラート'};
156
+
157
+ var MailText = rangeC +" "+ rangeS;
158
+
159
+ var subject = "GASからの送信";
160
+
161
+ for(var i=2; i<=lastRow; i++)
162
+
163
+ {
164
+
165
+ if (ss.getRange(i, 21).getValue() == "送信")
166
+
167
+ {
168
+
169
+ var rangeC = ss.getRange('C' + i).getValue();
170
+
171
+ var rangeS = ss.getRange('S' + i).getValue();
172
+
143
- }
173
+ }
174
+
175
+ }
144
176
 
145
177
 
146
178
 
147
- ところが、該当行からのメールが2,3通ずつ送信されてしまうようです。
179
+ GmailApp.sendEmail(address, subject, MailText,options );
148
180
 
149
- 2通だったり3通だったり不規則なのですが、実際はもっと多数の送信処理を
181
+ }
150
182
 
151
- 始めているのでサーバーがすぐに停止処理してるのかもしれません。
183
+ ```
152
184
 
153
185
 
154
186
 
155
- 何回かテストするだけでGASからは Exception: 1 日にサービス email を実行した回数多すぎます。(行 15、ファイル「コード」)
187
+ これを実行する本文とタイトルが「undefined undefined」のメール1通だけ来ます。
156
188
 
189
+ GmailApp.sendEmailの行の前の } を1つ後ろに持ってくると同じメールが8つ程来てから
190
+
191
+ Exception: 1 日にサービス email を実行した回数が多すぎます。(行 17、ファイル「コード」) というエラー
192
+
157
- のエラーが来てまいます
193
+ になりま
158
194
 
159
195
 
160
196
 
161
- 原因なのでしょうか、、、、?
197
+ さっきまでは、本文にC列S列入ったメールが複数ずつ来てたのですが今回はundefinedです。
162
198
 
163
- なたかよろくお願いいします。
199
+ だんだんわからくなってきまし(汗)24時間sendEmailが使えなくなりました~

1

O列の値をP列にて判定し、判定されたキーワードを含む行のA列とO列の値をメール本文に書き入れることには成功しましたが、、、

2020/07/28 12:23

投稿

khalipon
khalipon

スコア2

test CHANGED
File without changes
test CHANGED
@@ -83,3 +83,81 @@
83
83
 
84
84
 
85
85
  どなたかアドバイスよろしくお願いいたします。_(._.)_
86
+
87
+
88
+
89
+
90
+
91
+ 追記です
92
+
93
+ あれからいろいろ参考にしながら試しています。
94
+
95
+
96
+
97
+ P1に "=IF(O1>=100.5,"送信","false")" と入れて、O列の値が0.5%以上のさやが開く時に
98
+
99
+ 「送信」判定を入れるするようにしました。
100
+
101
+
102
+
103
+ その上で下記のコードを入れ、送信 という文字の入った行のA列、O列の値をメール本文として
104
+
105
+ 送信するようにしました。
106
+
107
+
108
+
109
+ function sendmail() {
110
+
111
+ var ss = SpreadsheetApp.getActive().getSheetByName('シート1');
112
+
113
+ var lastRow = ss.getLastRow();
114
+
115
+ var address = 'aaa@bbb.com';
116
+
117
+ var options = {name: 'アビトラアラート'};
118
+
119
+
120
+
121
+ for(var i=2; i<=lastRow; i++){
122
+
123
+ if (ss.getRange(i, 16).getValue() == "送信"){
124
+
125
+ var rangeA = ss.getRange('A' + i).getValue();
126
+
127
+ var rangeO = ss.getRange('O' + i).getValue();
128
+
129
+ }
130
+
131
+
132
+
133
+ var MailText = rangeA +" "+ rangeO;
134
+
135
+ var subject = "GASよりメール送信";
136
+
137
+ GmailApp.sendEmail(address, subject, MailText,options );
138
+
139
+
140
+
141
+ }
142
+
143
+ }
144
+
145
+
146
+
147
+ ところが、該当行からのメールが2,3通ずつ送信されてしまうようです。
148
+
149
+ 2通だったり3通だったり不規則なのですが、実際はもっと多数の送信処理を
150
+
151
+ 始めているのでサーバーがすぐに停止処理してるのかもしれません。
152
+
153
+
154
+
155
+ 何回かテストするだけで、GASからは Exception: 1 日にサービス email を実行した回数が多すぎます。(行 15、ファイル「コード」)
156
+
157
+ のエラーが来てしまいます。
158
+
159
+
160
+
161
+ 何が原因なのでしょうか、、、、?
162
+
163
+ どなたかよろしくお願いいたします。