ピナクルのオッズをGoogleスプレッドシートで
このガイドでは、ピナクルのサッカーの1X2オッズをGoogleスプレッドシートに書き込みます。1試合1行で、小数オッズ、マージンなしのフェアオッズ、マーケットのマージンを表示します。時間主導型のトリガーで、シートを15分ごとに更新します。スクリプトはPinnFeedのREST APIを使うため、Freeプラン(0ユーロ、30秒遅延、1日1,000リクエスト)でも動作します。
ステップ 1 — Freeのキーを取得する#
- pinnfeed.io でアカウントを作成し、ダッシュボードを開きます。
- キーを作成してコピーします。キーは
ps_live_…の形式です。 - Freeでは、ダッシュボードで最大2競技を選択します。スクリプトはデフォルトでサッカー(
soccer)を使います。別の競技を選んだ場合はSPORTを変更してください。
スプレッドシートにBuilderは必要ありません。Builder(月額99ユーロ、WebSocketプラン)は、PythonとNodeのガイドのようなリアルタイムのプッシュ型クライアント向けです。
ステップ 2 — スプレッドシートを作成する#
- 新しいGoogleスプレッドシートを作成します。
- 最初のシートの名前を Odds に変更します(スクリプトはこの名前で検索するため、正確に入力してください)。
- 拡張機能 → Apps Script を開きます。サンプルの関数
myFunctionを削除し、次のステップのためにプロジェクトを空にしておきます。
ステップ 3 — スクリプトを貼り付けてプロパティを設定する#
Code.gs に次のコードを貼り付けます。
// Google Apps Script: 拡張機能 → Apps Script を開き、このファイルを貼り付けます。
// スクリプト プロパティ(プロジェクトの設定 → スクリプト プロパティ):
// PINNFEED_BASE = https://pinnfeed.io
// PINNFEED_KEY = ps_live_...
// "Odds" という名前のシートを追加し、refreshOdds を一度実行してから、15分ごとのトリガーを追加します。
const PROPS = PropertiesService.getScriptProperties();
const BASE = PROPS.getProperty('PINNFEED_BASE') || 'https://pinnfeed.io';
const KEY = PROPS.getProperty('PINNFEED_KEY');
const SPORT = 'soccer'; // basketball、tennis などに変更可能(プランに含まれる競技に限る)
function refreshOdds() {
if (!KEY) {
console.error('Set script property PINNFEED_KEY first');
return;
}
const url = BASE + '/v1/odds'
+ '?sport=' + encodeURIComponent(SPORT)
+ '&market=moneyline&main=true&live=false&limit=500';
const res = UrlFetchApp.fetch(url, {
headers: { 'x-api-key': KEY },
muteHttpExceptions: true,
});
const code = res.getResponseCode();
if (code !== 200) {
console.warn('PinnFeed HTTP ' + code + ': ' + res.getContentText().slice(0, 300));
return; // 取得に失敗した場合はシートをそのまま残す
}
const data = JSON.parse(res.getContentText());
const rows = [];
for (const ev of data.events || []) {
const ml = (ev.markets || []).find((m) => m.type === 'moneyline' && m.main);
if (!ml) continue;
const byName = {};
for (const o of ml.outcomes || []) byName[o.name] = o;
const home = byName.home || {};
const draw = byName.draw || {};
const away = byName.away || {};
rows.push([
ev.startTime ? new Date(ev.startTime) : '',
(ev.league && ev.league.name) || '',
ev.home || '',
ev.away || '',
home.decimal || '',
draw.decimal || '',
away.decimal || '',
home.fair || '',
draw.fair || '',
away.fair || '',
ml.margin != null ? ml.margin : '',
ev.id,
]);
}
const sheet = SpreadsheetApp.getActive().getSheetByName('Odds');
if (!sheet) {
console.error('Create a tab named Odds first');
return;
}
sheet.clearContents();
sheet.appendRow([
'Starts', 'League', 'Home', 'Away',
'1', 'X', '2',
'Fair 1', 'Fair X', 'Fair 2',
'Margin', 'Event id',
]);
if (rows.length) {
sheet.getRange(2, 1, rows.length, 12).setValues(rows);
}
console.log('Wrote ' + rows.length + ' moneyline rows for ' + SPORT);
}
次に、プロジェクトの歯車アイコン(プロジェクトの設定)を開き、スクリプト プロパティに以下を追加します。
| プロパティ | 値 |
|---|---|
PINNFEED_KEY | お客様のキー(ps_live_…) |
PINNFEED_BASE | https://pinnfeed.io(任意。デフォルト値です) |
キーをシートのセルに貼り付けたり、Apps Scriptのプロジェクトを公開で共有したりしないでください。
ステップ 4 — 一度実行して承認する#
- 関数のプルダウンで
refreshOddsを選び、実行をクリックします。 - 外部サービスへの接続とシートの編集について、Googleから許可を求められます。ご自身のアカウントで承認してください。
- シートを再読み込みします。Oddsシートに
Starts、League、Home、Away、1、X、2、3つのフェアオッズ、Margin、Event idの列が表示されます。
呼び出しに失敗した場合(キーの誤り、リクエスト上限、プラン外の競技など)、スクリプトは警告を記録し、以前の行をそのまま残します。一時的な不具合でダッシュボードが空になることはありません。
ステップ 5 — 15分ごとのトリガーを追加する#
- Apps Scriptでトリガー(時計のアイコン)→ トリガーを追加を開きます。
- 関数:
refreshOdds。イベントのソース:時間主導型。タイプ:分ベースのタイマー。間隔:15分おき。 - 保存します。
1競技なら1日96回の呼び出しで、Freeプランの1日1,000リクエスト・毎秒1リクエストを大きく下回ります。2競技を30分ごとに更新しても96回です。プランと上限(英語)もご覧ください。
| トリガー | 1日の呼び出し回数 | Freeで利用可能か |
|---|---|---|
| 15分ごと、1競技 | 96 | はい |
| 30分ごと、2競技 | 96 | はい |
| 15分ごと、2競技 | 192 | はい |
| 1分ごと、1競技 | 1,440 | いいえ — Hobby以上が必要(1日の上限なし) |
Apps Scriptにも独自の割り当て上限があり、時間主導型トリガーの最短間隔は1分です。
ステップ 6 — フェアオッズとマージンを読む#
1X2の各行には、スキーマに記載されたPinnFeedのマージンなしのフィールドが含まれます。
Fair 1/Fair X/Fair 2— 各結果の小数フェアオッズfair(乗法的な方法でマージンを除去)。Margin— マーケットのmargin(オーバーラウンド=暗黙の確率の合計 − 1)。
別のシートにあるソフトなブックメーカーのオッズと比較する際は、これらの列を使います。期待値は soft × (1 / fair) − 1 で、バリューベットのガイドと同じ計算です。ライブのスチームを追うのにスプレッドシートは向いていません。BuilderのWebSocketとスチーム検知のガイドをお使いください。
よくある質問#
どのPinnFeedプランが必要ですか?#
数分ごとに更新される遅延ありのダッシュボードならFreeで十分です。Hobby(月額29ユーロ)では1日の上限と30秒の遅延がなくなりますが、RESTのみです。リアルタイムのプッシュにはBuilder(月額99ユーロ)が必要です。
スクリプトがURLのパラメーターではなく x-api-key を使うのはなぜですか?#
ドキュメントで推奨している認証ヘッダーだからです。Apps Scriptの UrlFetchApp はヘッダーを送信できるため、ログに残る可能性があるURLにキーを含める理由はありません。
価格の推移をグラフにできますか?#
はい。Oddsシートはライブのダッシュボードとして使い(実行のたびに消去・再書き込みされます)、更新ごとに行を追加するだけの2枚目のシートを用意して、折れ線グラフを挿入してください。履歴のシートは消去しないでください。
成人向けの教育コンテンツですか?#
はい。オッズデータとスプレッドシートのツールは、18歳以上の方を対象とした教育目的の内容です。予想、確実なベット、利益の約束ではありません。
関連ページ#
- REST APIリファレンス(英語)—
/v1/oddsのフィルターとページネーション - マージンなしのフェアオッズでバリューベット
- Telegramの予想ボット — スプレッドシートでは物足りなくなったら
- 料金