自動化を構築する必要があるもの。 GoogleスプレッドシートでHTTP APIを使用する

一般的な自動化の時代では、ユーザーは「ボタンをクリックして答えを得る」ことを望んでいます。 さて、またはさらにマウスを少し動かします。 タブレットの形式で便利に表示されるレポートおよびその他の自動化は、多くの場合、Excelで独自のマクロまたは単に組み込み式を使用して構築されます。 ところで、Excelプラグインを使用しているユーザーを驚かせることはありません。ところで、 1つもありますが、これは別の記事の主題です。 グーグルシートはどうですか? 以前、同僚 APIをTelegramに結び付ける方法を教えてくれましたが、Googleのテーブルでそれを使用する方法を教えようとします。







画像







カッターの下に小さなコードと松葉杖がたくさん。







私たちは明らかにブラウザで動作します。 関数を作成するために、 Google Apps Scriptを使用します 。この構文は、削除されたjavascriptに疑わしく似ています。 コーディングの方法はわからないが、ドキュメントを読みたくないという原則から進めますが、Stackoverflowドリブン開発手法で説明されているアプローチを積極的に使用します。







初心者の方は、 こちらを読むことをお勧めします。







準備する



まず、 APIにアクセスします 。 無料(アカウントマネージャーが電話を苦しめない限り)およびSMSなし、ただし登録あり。 ドキュメントを読むことはありません(とにかく、写真はありません)、 jwt.ioを介して手でアクセストークンを生成します。 なぜ手? 当社のウェブサイトによって生成されたトークンは1時間で期限切れになるためです。 これは、たとえばWebサイトで使用する場合に便利ですが、Sheetsでの通常の操作では、1年ほど長生きさせてください。 トークンの作成手順については、 こちらをご覧ください







APIを使用する



ここで、空のテーブルを作成し、スクリプトエディターに移動します。 誰も知らない場合は、 ツールスクリプトエディターを呼び出してそこに到達できます。 エディターでは、いくつかのグローバル変数を宣言します。







var BASE_URL_API = "/md/1.0"; var BASE_URL_HOST = "https://api-demo.exante.eu"; var BASE_URL = BASE_URL_HOST + BASE_URL_API; var TOKEN = "your-token-from-jwt-io";
      
      





クエリを操作するための関数も定義します。







 function _payload() { return { "method": "get", "headers": { "Authorization": "Bearer " + TOKEN } }; } function _parse(url) { var response = UrlFetchApp.fetch(url, _payload()); var code = result.getResponseCode(); if (code != 200) throw new Error(response.message); return JSON.parse(response.getContentText()); }
      
      





UrlFetchApp



とその引数の詳細については、 こちらをご覧ください 。 さらに、200以外のコードをキャッチし、リクエストから「人間が読み取れる」エラーをユーザーに表示します。







APIからの静的情報



ここで、APIの呼び出しを台無しにしてみましょう。 ただし、ここでは、ドキュメントを開いて、そこに本当に美しい写真がないことを確認する必要がありました。







まず、金融商品のリクエストを実装するメソッドを作成します。 私が言ったように、トラフィックを節約するために、ツールに関する情報は2つの/symbols/:symbolId



に分割されました- /symbols/:symbolId



および/symbols/:symbolId/specification









 var SYMBOL_SPEC_FIELDS = ["leverage", "lotSize", "contractMultiplier", "priceUnit", "units"]; function EXANTESYMBOL(symbol, field) { var url = BASE_URL + "/symbols/" + encodeURIComponent(symbol); if (field in SYMBOL_SPEC_FIELDS) url += "/specification"; return _parse(url)[field]; }
      
      





以下では、金融商品の名前( symbol



)をエンコードする必要があります。これは、たとえば/



などの奇妙な文字が含まれている可能性があるためです。







次に、 オプション先物を扱うための同様のメソッドを作成します







 function EXANTEGROUP(group, field) { var url = BASE_URL + "/groups/" + group; return _parse(url)[field]; } function EXANTEGROUPNEAREST(group, field) { var url = BASE_URL + "/groups/" + group + "/nearest"; return _parse(url)[field]; }
      
      





引用とキャンドル



ろうそくは、財務チャート上の特別な指標です。 何をしているかを理解するには、1つの「キャンドル」が4つの値[___, ___, ___, ___]



表されていることを知るだけで十分です。 間隔は秒単位で設定され、一般に、関数は次のようになります。







 function EXANTEOHLC(symbol, duration, what) { var url = BASE_URL + "/ohlc/" + encodeURIComponent(symbol) + "/" + duration + "?size=1"; return _parse(url)[0][what]; }
      
      





次に、 EXANTEOHLC("EUR/USD.E.FX", 60, "high")



ようなリクエストにより、最後の1分間の最高価格が返されます。







引用符ではもう少し複雑です。 執筆時点で、引用符を取得するための唯一のAPIは、Appsスクリプトで使用するには不便なストリームです。 (ところで、彼らは将来のリリースで一重引用符のための新しいAPIを追加することを約束します)。 したがって、利用可能な資金から解決策を強化する必要がありました。 構造上、 close



ないろうそくをclose



(つまり、現在の分/時間/日)は、最後に受け取った購入価格と販売価格の平均です。したがって、







 function EXANTEMID(symbol) { return EXANTEOHLC(symbol, 60, "close"); }
      
      





完全に幸せにするために、ある通貨から別の通貨への変換関数を作成することもできます。







 function EXANTECROSSRATES(from, to) { var url = BASE_URL + "/crossrates/" + from + "/" + to; return _parse(url)["rate"]; }
      
      





使用する



ここで、Excelの通常のメソッドとして関数を使用してみます。 最初に直面する問題は、値の更新です。 実際、Googleは、パラメーターが変更されていなければ、ユーザー定義関数を頻繁に再カウントする必要はないと考えています。 「ライブ」であると想定されるクォートの場合、これは少し重要です。 この問題を回避するには、関数EXANTEOHLC



EXANTECROSSRATES



、およびEXANTEMID



別の「可変」(ただし実際にはそうではない)が使用されていない引数をEXANTEOHLC



timestamp



と呼びます。







 function EXANTECROSSRATES(from, to, timestamp) { var url = BASE_URL + "/crossrates/" + from + "/" + to; return _parse(url)["rate"]; } function EXANTEOHLC(symbol, duration, what, timestamp) { var url = BASE_URL + "/ohlc/" + encodeURIComponent(symbol) + "/" + duration + "?size=1"; return _parse(url)[0][what]; } function EXANTEMID(symbol, timestamp) { return EXANTEOHLC(symbol, 60, "close", timestamp); }
      
      





次に、このtimestamp



を生成する関数を実装します。







 function EXANTEUPDATE() { SpreadsheetApp.getActiveSheet().getRange('A1').setValue(new Date().toTimeString()) SpreadsheetApp.flush(); }
      
      





セルA1



を大胆に民営化し、同時にシートを変更する追加の権利を要求したことに注意してください。 セキュリティを強化するために、 Googleは @OnlyCurrentDoc



挿入して、スクリプトが一度にすべてのドキュメントの権利を要求しないようにすることをお勧めします。







 /** * @OnlyCurrentDoc */
      
      





ちなみに、一見、 NOW()



関数(ユーザビリティ設定に特別なチェックマークがある場合、1分に1回再カウントできる数少ない関数の1つNOW()



使用できますが、その値をユーザー定義関数、悲しみに渡すことはできません。







1分に1回自動的にデータを更新するには、 編集現在のプロジェクトのトリガーで記述された関数のトリガーを作成できます。







画像







ユーザーが完全に幸せになるように、ボタンを追加して( InsertDrawing ...でプレートで行います )、それをEXANTEUPDATE



関数に関連付けることがEXANTEUPDATE



ます。







ああ、今はそれで作業できるようです。 最寄りのFORTS:Si先物契約(USD / RUB)を試して、ろうそくを見てみましょう:







画像







しかし、自動化について話しているので、一度に100個のツール用にこのようなプレートを作成してみませんか? ああ...







画像







しかし、私は自分でこの問題を回避する方法を見つけることを提案します:)おそらく最善ではないが、JSONから1つのフィールドのみを取得する同じタイプのリクエストに対して非常に有効なソリューション(たとえばEXANTEOHLC



)-グローバル変数でキャッシュを使用します。 より良い解決策は、1つのリクエストで複数の金融商品のリストをコンマで区切って送信することです(たとえば、ろうそくの場合)。







ドキュメント



ストーリーの中で見逃したオプションのアイテム。 JSDocに従って関数にコメントを付け 、オプションで@customfunctionを追加でき@customfunction



。次に例を示します。







 /** * mid (average between bid and ask) value * @param {string} symbol * symbol ID * @param {string} [timestamp] * dummy parameter for update feature * @returns {number} mid value for specified symbol * @customfunction */
      
      





この場合、ユーザーには、この関数を正しく使用する方法、必要な引数、および返される値に関する美しいヘルプが表示されます。 Google Dockstringの解析は自由裁量に任されていますが、一般的にはJSDocと非常によく似ています。










以上です。 使用して公開できるようになりました。 トークンのみをカットしてください:)この「スクリプト」のソースコードは、MITライセンスの下でgithubにあります。








All Articles