株の価格を毎日確認して記録したい。いくつかの銘柄を指定しておきたい。価格に変動があれば、discodeに通知したい、
それ、Kaoruらしいスマートなワークフローですね📈✨
目的は「指定銘柄の株価を毎日取得 → 変動を検知 → Discordに通知」なので、以下のような構成が考えられます:
🧩 構成概要
| ステップ | 内容 | 技術候補 |
|---|---|---|
| ① 銘柄リストの管理 | 監視対象の株式コードを指定 | JSON / Google Sheets / YAML など |
| ② 株価の取得 | 毎日定時に最新価格を取得 | Python + API(例:Yahoo Finance, Alpha Vantage) |
| ③ 価格の記録 | 過去の価格と比較できるよう保存 | CSV / SQLite / Google Sheets |
| ④ 変動検知 | 前日比や指定閾値で変化を判定 | Pythonロジック(±x%以上など) |
| ⑤ Discord通知 | 変動があればWebhookで通知 | Discord Webhook + requestsライブラリ |
🛠️ Pythonスクリプトの骨格(例)
import yfinance as yf import requests import datetime # 銘柄リスト tickers = [‘AAPL’, ‘MSFT’, ‘GOOGL’] threshold = 0.02 # 2%変動で通知 # Discord Webhook URL WEBHOOK_URL = ‘https://discord.com/api/webhooks/xxxx/yyyy’ # 株価取得と比較 for ticker in tickers: stock = yf.Ticker(ticker) today = datetime.datetime.now().date() hist = stock.history(period=”2d”) if len(hist) < 2: continue price_today = hist[‘Close’][-1] price_yesterday = hist[‘Close’][-2] change = (price_today – price_yesterday) / price_yesterday if abs(change) >= threshold: message = f”{ticker} の株価が {change*100:.2f}% 変動しました。\n昨日: {price_yesterday:.2f} → 今日: {price_today:.2f}” requests.post(WEBHOOK_URL, json={“content”: message})
🧠 Kaoru向けのカスタマイズ案
- Whisperや字幕処理と同じく「ログ保存・再現性」を重視するなら SQLite or Google Sheets 連携もおすすめ
- 日本株(例:7203.T トヨタ)を扱うなら
yfinanceで.Tを付ける必要あり - Discord通知を「Embed形式」にすれば視認性アップ
- 複数銘柄の変動をまとめて通知 or 個別通知も選べる
もし「Google Apps Scriptでスプレッドシート連携したい」「ffmpegで株価チャートを動画化したい」みたいな応用も考えてるなら、そこも一緒に設計できますよ。
銘柄リストや通知条件、保存形式など、もう少し具体的に教えてもらえたら、さらにKaoru仕様に仕上げられます。どうします?
①、③はgoogle sheetにします。②は、google ファイナンスを主とします
了解です、Kaoru。Google SheetsとGoogle Finance関数を活用するなら、かなり自然で再現性の高い構成が組めそうですね。以下に、Kaoru仕様の設計案をまとめました:
🧩 全体構成(Google中心)
| ステップ | 実装方法 | 備考 |
|---|---|---|
| ① 銘柄リスト管理 | Google Sheetsに記載 | 例:A1:A10 に銘柄コード(例:AAPL、7203.T) |
| ② 株価取得 | =GOOGLEFINANCE() 関数 | 自動更新。例:=GOOGLEFINANCE("AAPL", "price") |
| ③ 価格記録 | スクリプトで日付付き保存 | Google Apps Scriptで毎日記録(履歴管理) |
| ④ 変動検知 | 前日比をスクリプトで判定 | 閾値(例:±2%)を超えたら通知対象に |
| ⑤ Discord通知 | Webhook + Apps Script | UrlFetchApp.fetch() で通知送信 |
🧠 Google Sheetsの構成例
| セル範囲 | 内容 |
|---|---|
A2:A | 銘柄コード(例:AAPL, MSFT, 7203.T) |
B2:B | 現在価格(=GOOGLEFINANCE(A2, "price")) |
C2:C | 前日価格(Apps Scriptで記録) |
D2:D | 変動率(=(B2-C2)/C2) |
E2:E | 通知フラグ(スクリプトで判定) |
🛠️ Apps Scriptの骨格(概要)
function checkStockPrices() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Stocks”); const data = sheet.getDataRange().getValues(); const webhookUrl = “https://discord.com/api/webhooks/XXXX/YYYY”; const threshold = 0.02; // 2% for (let i = 1; i < data.length; i++) { const ticker = data[i][0]; const currentPrice = data[i][1]; const previousPrice = data[i][2]; if (!currentPrice || !previousPrice) continue; const change = (currentPrice – previousPrice) / previousPrice; if (Math.abs(change) >= threshold) { const message = `${ticker} の株価が ${Math.round(change * 10000) / 100}% 変動しました。\n昨日: ${previousPrice} → 今日: ${currentPrice}`; UrlFetchApp.fetch(webhookUrl, { method: “post”, contentType: “application/json”, payload: JSON.stringify({ content: message }) }); } // 前日価格を更新 sheet.getRange(i + 1, 3).setValue(currentPrice); } }
※ この関数を「毎日定時に実行」するには、Apps Scriptの「トリガー」機能で時間ベースの自動実行を設定できます。
✨ Kaoru向けの拡張アイデア
- 変動率に応じて通知の色分け(Discord Embed形式)
- 複数シートで「米国株」「日本株」など分類
- 株価以外に「出来高」「PER」なども取得可能(Google Finance関数)
- 価格履歴を別シートに日付付きで蓄積 → グラフ化も可能
この構成なら、Kaoruの「再現性・自然さ・人間らしい出力」へのこだわりにもぴったりハマると思います。
もし「通知文を日本語で自然にしたい」「変動率の計算を丸めたい」「複数Webhookに分岐したい」などあれば、そこも一緒に詰めていきましょう。どこから着手します?
基本的に米国株のみです。インテル(INTC)、テスラ(TSLA)、AAPU、ラムリサーチ(LRCX)でサンプル提示して
了解です、Kaoru。米国株4銘柄(INTC, TSLA, AAPL, LRCX)を対象に、Google Sheets + Google Finance + Apps Scriptで構成するサンプルを提示します。以下は、実際に動かせるような設計とコード例です。
📊 Google Sheetsの構成例
| セル | 内容 |
|---|---|
| A1:A5 | 銘柄コード(INTC, TSLA, AAPL, LRCX) |
| B列 | 現在価格(=GOOGLEFINANCE(A2, "price")) |
| C列 | 前日価格(Apps Scriptで記録) |
| D列 | 変動率(=(B2-C2)/C2) |
| E列 | 通知フラグ(スクリプトで判定) |
🧠 Apps Scriptサンプルコード
function checkUSStocks() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Stocks”); const data = sheet.getDataRange().getValues(); const webhookUrl = “https://discord.com/api/webhooks/XXXX/YYYY”; // ← あなたのWebhookに置き換え const threshold = 0.02; // 2%変動で通知 for (let i = 1; i < data.length; i++) { const ticker = data[i][0]; const currentPrice = data[i][1]; const previousPrice = data[i][2]; if (!currentPrice || !previousPrice) continue; const changeRate = (currentPrice – previousPrice) / previousPrice; const changePercent = Math.round(changeRate * 10000) / 100; if (Math.abs(changeRate) >= threshold) { const message = `📈 ${ticker} の株価が ${changePercent}% 変動しました。\n昨日: $${previousPrice.toFixed(2)} → 今日: $${currentPrice.toFixed(2)}`; UrlFetchApp.fetch(webhookUrl, { method: “post”, contentType: “application/json”, payload: JSON.stringify({ content: message }) }); sheet.getRange(i + 1, 5).setValue(“通知済み”); } else { sheet.getRange(i + 1, 5).setValue(“”); } // 前日価格を更新 sheet.getRange(i + 1, 3).setValue(currentPrice); } }
⏰ 自動化の設定
- Apps Scriptの「トリガー」から
checkUSStocks()を毎日定時(例:午前9時)に実行するよう設定 - Google Finance関数はシートを開いたときに自動更新されるため、スクリプト実行前に価格が最新になっていることが理想
✨ Kaoru向けの拡張案
- 変動率が大きい順に並び替え(視認性アップ)
- Discord通知をEmbed形式にして、色分けやリンク追加
- 株価履歴を別シートに日付付きで蓄積 → グラフ化
- 複数Webhookで「急騰」「急落」など通知先を分岐
この構成なら、Kaoruの「自然で人間らしい出力」「再現性のある記録」「柔軟な通知制御」にぴったりです。
次は通知文の日本語表現をもっと自然にしたい?それとも履歴保存の設計を詰めていきます?
通知について、銘柄ごとに上限値と下限値を決めておいて、範囲外のときに通知したい
それ、Kaoruらしい精密な制御ですね📉📈
銘柄ごとに「上限値・下限値」を設定して、現在価格がその範囲を外れたときだけDiscord通知する構成、ばっちり実現できます。Google Sheets + Apps Scriptでの設計案を以下にまとめました:
🧩 Google Sheets構成(例)
| 列 | 内容 |
|---|---|
| A列 | 銘柄コード(例:AAPL, TSLA) |
| B列 | 現在価格(=GOOGLEFINANCE(A2, "price")) |
| C列 | 上限価格(例:250) |
| D列 | 下限価格(例:180) |
| E列 | 前回通知価格(Apps Scriptで記録) |
| F列 | 通知フラグ(Apps Scriptで更新) |
🛠️ Apps Scriptサンプルコード
function notifyIfOutOfRange() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Stocks”); const data = sheet.getDataRange().getValues(); const webhookUrl = “https://discord.com/api/webhooks/XXXX/YYYY”; // ← あなたのWebhookに置き換え for (let i = 1; i < data.length; i++) { const [ticker, currentPrice, upperLimit, lowerLimit, lastNotified] = data[i]; if (!currentPrice || !upperLimit || !lowerLimit) continue; const outOfRange = currentPrice > upperLimit || currentPrice < lowerLimit; const alreadyNotified = currentPrice === lastNotified; if (outOfRange && !alreadyNotified) { const direction = currentPrice > upperLimit ? “上限超え📈” : “下限割れ📉”; const message = `⚠️ ${ticker} が ${direction} です。\n現在価格: $${currentPrice.toFixed(2)}\n設定範囲: $${lowerLimit} ~ $${upperLimit}`; UrlFetchApp.fetch(webhookUrl, { method: “post”, contentType: “application/json”, payload: JSON.stringify({ content: message }) }); // 通知済み価格を記録 sheet.getRange(i + 1, 5).setValue(currentPrice); sheet.getRange(i + 1, 6).setValue(“通知済み”); } else { sheet.getRange(i + 1, 6).setValue(“”); } } }
✨ Kaoru向けの拡張案
- 上限・下限を「Google Sheetsの別シート」で一元管理 → メンテナンス性向上
- 通知文に「前回通知との差分」や「何日ぶりの範囲外か」など自然言語的な補足を追加
- Discord通知をEmbed形式にして、銘柄ごとに色分け・リンク追加
- 通知済み価格が変化したときだけ再通知(無駄な連投防止)
この構成なら、Kaoruの「人間らしい出力」「再現性」「柔軟な制御」にぴったりです。
次は「通知文の自然さ」や「履歴保存の設計」など、どこを深掘りしましょうか?それともこのまま実装に入ります?
株価履歴を別シートに日付付きで蓄積 → グラフ化の機能を追加したいです。1日一度notifyIfOutOfRange()がトリガー起動されますので、そのタイミングで登録済みの銘柄について、現在株価をロギングしたい
素晴らしい追加機能です、Kaoru。
「範囲外通知」と「履歴ロギング」を同じトリガーで動かすことで、再現性とメンテナンス性がぐっと高まりますね。以下に、Google Sheets + Apps Scriptでの設計とコード例を提示します。
🧩 構成概要
| シート名 | 用途 |
|---|---|
Stocks | 銘柄コード・現在価格・通知条件などを管理 |
History | 日付付きで株価履歴を蓄積(グラフ化用) |
📊 History シートの構成例
| A列 | B列 | C列 | D列 | E列 |
|---|---|---|---|---|
| 日付 | INTC | TSLA | AAPL | LRCX |
| 2025/08/19 | 34.56 | 245.78 | 189.34 | 720.12 |
| 2025/08/20 | … | … | … | … |
🛠️ Apps Scriptの追加コード(履歴ロギング)
function logStockPricesToHistory() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const stockSheet = ss.getSheetByName(“Stocks”); const historySheet = ss.getSheetByName(“History”); const data = stockSheet.getDataRange().getValues(); const date = Utilities.formatDate(new Date(), “Asia/Tokyo”, “yyyy/MM/dd”); // 銘柄コードと現在価格を抽出 const tickers = []; const prices = []; for (let i = 1; i < data.length; i++) { const ticker = data[i][0]; const currentPrice = data[i][1]; if (ticker && currentPrice) { tickers.push(ticker); prices.push(currentPrice); } } // ヘッダーがなければ作成 const header = historySheet.getRange(1, 1, 1, historySheet.getLastColumn()).getValues()[0]; if (header[0] !== “日付”) { historySheet.getRange(1, 1).setValue(“日付”); for (let j = 0; j < tickers.length; j++) { historySheet.getRange(1, j + 2).setValue(tickers[j]); } } // 日付行の追加 const newRow = [date, …prices]; historySheet.appendRow(newRow); }
🔁 トリガー統合案
既存の notifyIfOutOfRange() に logStockPricesToHistory() を組み込めば、1回のトリガーで両方実行できます:
function dailyStockCheck() { notifyIfOutOfRange(); logStockPricesToHistory(); }
この dailyStockCheck() を毎日定時にトリガー実行すればOKです。
📈 グラフ化のヒント
Historyシートで「日付 vs 銘柄価格」の折れ線グラフを作成- 銘柄ごとに個別グラフ or 複数銘柄を重ねて比較も可能
- グラフを別シートに自動生成することも可能(Apps Scriptで)
この設計なら、Kaoruの「自然な出力」「履歴の再現性」「視覚的な把握」にぴったりです。
次は「グラフの自動生成」や「履歴のバックアップ」など、さらに深掘りしていきます?それともこのまま実装に入ります?
グラフを手動であらかじめ作っておくとした場合、データの追加の都度グラフも自動更新されますか?
はい、更新されます!📈
Google Sheetsのグラフは、参照範囲が動的であれば、新しいデータが追加されるたびに自動で反映されます。Kaoruのように履歴を appendRow() で蓄積していく場合、以下のポイントを押さえておくと安心です。
✅ 自動更新される条件
- グラフのデータ範囲が固定行数ではなく、列全体や行全体を参照している
例:History!A2:Eのように、行数を指定せず列全体を参照すると、行が増えてもグラフが追従します。 - グラフのX軸が「日付列」などで一貫性がある
→A列が日付で、B列以降が銘柄価格なら、折れ線グラフで自然に時系列が伸びていきます。
🛠️ もし手動で作成するなら
Historyシートで、A列を「日付」、B列以降を銘柄価格として整備- グラフ作成時に「範囲を
A1:Eのように列全体指定」にする - グラフの「設定」で「行の追加時に自動更新」を確認(通常はデフォルトでON)
💡 さらに柔軟にしたいなら
Apps Scriptで「グラフのデータ範囲をスクリプトで更新」することも可能です。
たとえば、行数が増えたら chart.getRange() を更新するような処理も組めます。
Kaoruのように「履歴の再現性」と「視覚的な自然さ」を重視するなら、列全体参照でのグラフ設計が最もスマートです。
もし銘柄ごとに個別グラフを分けたい、あるいは一定期間だけを表示したいなど、もっと細かく制御したい場合も対応できますよ。どうします?グラフの自動生成にも踏み込みます?

コメント