On the wire · 16:01:39 UTC Live 126 · Prematch 8,738 · Markets 36,256 Vol. I · No. 1 · Monday 9 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
ガイド · Googleスプレッドシート · Apps Script

ピナクルのオッズをGoogleスプレッドシートで

更新日 · PinnFeed · 約2分で読めます

このガイドでは、ピナクルのサッカーの1X2オッズをGoogleスプレッドシートに書き込みます。1試合1行で、小数オッズ、マージンなしのフェアオッズ、マーケットのマージンを表示します。時間主導型のトリガーで、シートを15分ごとに更新します。スクリプトはPinnFeedのREST APIを使うため、Freeプラン(0ユーロ、30秒遅延、1日1,000リクエスト)でも動作します。

ステップ 1 — Freeのキーを取得する#

  1. pinnfeed.io でアカウントを作成し、ダッシュボードを開きます。
  2. キーを作成してコピーします。キーは ps_live_… の形式です。
  3. Freeでは、ダッシュボードで最大2競技を選択します。スクリプトはデフォルトでサッカー(soccer)を使います。別の競技を選んだ場合は SPORT を変更してください。

スプレッドシートにBuilderは必要ありません。Builder(月額99ユーロ、WebSocketプラン)は、PythonとNodeのガイドのようなリアルタイムのプッシュ型クライアント向けです。

ステップ 2 — スプレッドシートを作成する#

  1. 新しいGoogleスプレッドシートを作成します。
  2. 最初のシートの名前を Odds に変更します(スクリプトはこの名前で検索するため、正確に入力してください)。
  3. 拡張機能 → 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_BASEhttps://pinnfeed.io(任意。デフォルト値です)

キーをシートのセルに貼り付けたり、Apps Scriptのプロジェクトを公開で共有したりしないでください。

ステップ 4 — 一度実行して承認する#

  1. 関数のプルダウンで refreshOdds を選び、実行をクリックします。
  2. 外部サービスへの接続とシートの編集について、Googleから許可を求められます。ご自身のアカウントで承認してください。
  3. シートを再読み込みします。Oddsシートに Starts、League、Home、Away、1、X、2、3つのフェアオッズ、Margin、Event id の列が表示されます。

呼び出しに失敗した場合(キーの誤り、リクエスト上限、プラン外の競技など)、スクリプトは警告を記録し、以前の行をそのまま残します。一時的な不具合でダッシュボードが空になることはありません。

ステップ 5 — 15分ごとのトリガーを追加する#

  1. Apps Scriptでトリガー(時計のアイコン)→ トリガーを追加を開きます。
  2. 関数:refreshOdds。イベントのソース:時間主導型。タイプ:分ベースのタイマー。間隔:15分おき。
  3. 保存します。

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歳以上の方を対象とした教育目的の内容です。予想、確実なベット、利益の約束ではありません。

関連ページ#

WebSocketプラン:Builder、月額99ユーロ

ピナクルのオッズを1本のWebSocketでリアルタイムに。全13競技、全マーケット、マージンなしのフェアオッズとクロージングオッズ。3日間無料、ワンクリックで解約できます。

Form K-1 · Free API key

Get your free API key.

No password. We email you a link; click it and your key is on screen.

One free key per email. Link valid for 20 minutes.