
アプリを開かなくても、ホーム画面を見るだけで今日の運勢がわかるウィジェット
大吉〜大凶の7段階に加えて、ラッキーアイテム・ラッキーカラー・ラッキーナンバー・今日の一言アドバイスまで表示。
同じ日は何度見ても同じ結果だから、安心して毎朝チェックできる。
毎朝ホーム画面を見るついでに、ちょっと楽しめるものがあればと思って作りました。
かなりざっくり作ったので、おみくじの結果やメッセージのパターンはそれほど多くありません(笑)
「もっといろんな結果を出したい!」という方は、コードをChatGPTなどのAIに貼り付けて、「おみくじのパターンを増やして」とお願いしてみてください。
自分好みのメッセージを追加したり、ちょっと変わったおみくじに改造したりするのも面白いと思います。
ウィジェットの表示内容
日付を種にして結果を決めるため、同じ日は何度実行しても同じ結果になります。
サイズごとの表示
- 小:今日の運勢とラッキーアイテムをコンパクトに表示します。
- 中・大:運勢に加え、ラッキーアイテム・カラー・数字と一言アドバイスを表示します。
設定手順
上から順に進めてください。コードの保存と設定のコピーに必要な操作欄は、それぞれの手順の中にあります。
- Scriptableを用意する
App StoreでScriptableを開き、iPhoneにインストールします。すでに入っている場合は次へ進んでください。
- コードをコピーして保存する
下のコード欄の「コピー」を押します。Scriptableへ移動し、「+」から新しいスクリプトを作ってコード全文を貼り付け、今日のおみくじなどの名前で保存してください。
保存したらこのページに戻り、次の手順へ進みます。
// Version: 1.0.0 // 今日のおみくじ - Scriptable Widget // 小/中サイズのホーム画面ウィジェットに対応 // 同じ日には同じ結果が出るように、日付をシードにして運勢を決定します // ===== 設定 ===== const FORTUNES = [ { name: "大吉", weight: 8, color: "#FF3B30" }, { name: "中吉", weight: 15, color: "#FF9500" }, { name: "小吉", weight: 20, color: "#FFCC00" }, { name: "吉", weight: 25, color: "#34C759" }, { name: "末吉", weight: 18, color: "#5AC8FA" }, { name: "凶", weight: 10, color: "#5E5CE6" }, { name: "大凶", weight: 4, color: "#8E8E93" }, ]; const LUCKY_ITEMS = [ "折りたたみ傘", "青いボールペン", "コーヒー", "腕時計", "ハンカチ", "スニーカー", "手帳", "音楽プレイリスト", "観葉植物", "眼鏡拭き", "しおり", "キャンドル", "マグカップ", "リップクリーム", "鍵のキーホルダー", ]; const LUCKY_COLORS = [ "赤", "青", "黄色", "緑", "紫", "オレンジ", "白", "黒", "ピンク", "水色", ]; const ADVICES = [ "小さな一歩が大きな変化につながる日。", "焦らず、いつも通りのペースで。", "誰かに感謝を伝えると運気が上がる。", "新しいことを始めるのに向いている日。", "無理せず、休むことも大事。", "整理整頓が幸運を呼び込む。", "直感を信じて行動してみて。", "人との縁を大切にすると良いことが。", "早起きが吉。朝の時間を有効に。", "水分補給をこまめに、体調管理を意識して。", "断捨離するとスッキリ運気アップ。", "普段話さない人と話すと発見がある。", ]; // ===== シード付き乱数(日付ベース) ===== function seededRandom(seed) { // xorshift的な簡易疑似乱数生成器 let x = seed; return function () { x ^= x << 13; x ^= x >>> 17; x ^= x << 5; x = x >>> 0; return (x % 100000) / 100000; }; } function getTodaySeed() { const now = new Date(); const y = now.getFullYear(); const m = now.getMonth() + 1; const d = now.getDate(); // 日付から適当な整数シードを作る return y * 10000 + m * 100 + d; } function pickWeighted(rand, items) { const total = items.reduce((sum, i) => sum + i.weight, 0); let r = rand() * total; for (const item of items) { if (r < item.weight) return item; r -= item.weight; } return items[items.length - 1]; } function pickFromArray(rand, arr) { const idx = Math.floor(rand() * arr.length); return arr[idx]; } // ===== 今日の運勢を計算 ===== const seed = getTodaySeed(); const rand = seededRandom(seed); // 複数回呼び出して結果に多様性を持たせる const fortune = pickWeighted(rand, FORTUNES); const luckyItem = pickFromArray(rand, LUCKY_ITEMS); const luckyColor = pickFromArray(rand, LUCKY_COLORS); const luckyNumber = Math.floor(rand() * 9) + 1; const advice = pickFromArray(rand, ADVICES); // ===== ウィジェット作成 ===== const widget = new ListWidget(); // 背景をグラデーションに const gradient = new LinearGradient(); gradient.locations = [0, 1]; gradient.colors = [ new Color(fortune.color, 0.85), new Color("#1c1c1e", 0.95), ]; widget.backgroundGradient = gradient; widget.setPadding(14, 16, 14, 16); // タイトル「今日のおみくじ」 const titleText = widget.addText("今日のおみくじ"); titleText.font = Font.systemFont(12); titleText.textColor = Color.white(); titleText.textOpacity = 0.7; widget.addSpacer(2); // 運勢(大きく表示) const fortuneText = widget.addText(fortune.name); fortuneText.font = Font.boldSystemFont(34); fortuneText.textColor = Color.white(); widget.addSpacer(8); // 中サイズ・大サイズのときだけ詳細を表示 if (config.widgetFamily !== "small") { const detailStack = widget.addStack(); detailStack.layoutVertically(); detailStack.spacing = 3; const itemLine = detailStack.addText(`🎁 ラッキーアイテム: ${luckyItem}`); itemLine.font = Font.systemFont(12); itemLine.textColor = Color.white(); const colorLine = detailStack.addText(`🎨 ラッキーカラー: ${luckyColor}`); colorLine.font = Font.systemFont(12); colorLine.textColor = Color.white(); const numberLine = detailStack.addText(`🔢 ラッキーナンバー: ${luckyNumber}`); numberLine.font = Font.systemFont(12); numberLine.textColor = Color.white(); widget.addSpacer(6); const adviceText = detailStack.addText(`💬 ${advice}`); adviceText.font = Font.italicSystemFont(11); adviceText.textColor = Color.white(); adviceText.textOpacity = 0.9; } else { // smallサイズはラッキーアイテムだけ簡潔に widget.addSpacer(); const smallInfo = widget.addText(`🎁 ${luckyItem}`); smallInfo.font = Font.systemFont(11); smallInfo.textColor = Color.white(); smallInfo.textOpacity = 0.9; } widget.addSpacer(); // フッター(タップで更新されることの案内) const footer = widget.addText("タップで更新確認"); footer.font = Font.systemFont(9); footer.textColor = Color.white(); footer.textOpacity = 0.4; // ===== 表示 ===== if (config.runsInWidget) { Script.setWidget(widget); } else { // アプリ内で実行したときはプレビュー表示 await widget.presentMedium(); } Script.complete(); - ホーム画面に追加して設定する
iPhoneのホーム画面を長押しし、ウィジェット追加画面からScriptableを選びます。この記事の対応サイズの説明に合わせてサイズを選んで追加してください。
追加したウィジェットを長押しして「ウィジェットを編集」を開き、「Script」に保存したスクリプトを選びます。
「Parameter」は空欄で構いません。
編集画面を閉じて表示を確認します。ホーム画面への反映には少し時間がかかる場合があります。
おみくじの仕組み
このウィジェットは占いサービスや外部APIから結果を取得しているものではありません。
その日の日付をもとにScriptable内で結果を生成しているため、通信環境に左右されず利用できます。
日付が変わると新しい結果になり、同じ日であれば基本的に同じおみくじが表示されます。
動作確認・使用結果
| 確認した端末 | iPhone 17 ProMAX |
|---|---|
| iOS | iOS27 |
| Scriptable | 1.7.19 |
| 確認したサイズ | 小・中・大 |
| バージョン | 1.0.0 |
| 動作確認日 | 2026-09-17 |
表示・使用時のポイント
日付を種にして結果を決めるため、同じ日は何度実行しても同じ結果になります。日付が変わると結果を作り直します。
更新履歴
1.0.0
- 初回リリース
よくあるエラーと対処
- 確認すること
- 表示されない場合は、ウィジェット編集画面の「Script」に保存したスクリプトが選ばれているかも確認してください。コードを貼り直すときは全文を置き換えます。
- 何度実行しても運勢が変わらない
- 同じ日に結果が変わらないのは仕様です。翌日の表示を確認してください。
- 日付が変わっても前日の結果が出る
- 端末の日付・時刻を確認し、Scriptableで一度実行してからホーム画面の更新を待ってください。
注意事項・制限
- 結果はコード内で生成する娯楽用のおみくじです。将来の出来事を予測するものではありません。
- 結果やアドバイスの種類は、コードに登録したパターンに限られます。
- ホーム画面の更新タイミングはiOSが管理するため、操作やデータの変更がすぐに反映されない場合があります。
データ提供・参考資料
このウィジェットにはデータ提供や参考資料は特にありません。
SHARE

