設定難易度

今日がどんな日なのか、ホーム画面を見るだけでわかる「今日は何の日?」ウィジェットです。
テレビやネットで「今日は○○の日です」と紹介されているのを見て、「毎日ホーム画面に出てきたらちょっと面白いかも」と思って作りました。
「猫の日」「コーヒーの日」「いい夫婦の日」など、その日の記念日を自動で取得して表示します。
日付が変われば内容も自動で切り替わるので、一度設定すれば毎日の操作は必要ありません。
何気なく見たホーム画面から、「今日そんな日なんや」とちょっとした発見を楽しめるウィジェットです。

ウィジェットの表示内容

その日の月日を使って記念日APIを検索します。

サイズごとの表示

  • 小:今日の記念日を最大2件表示します。
  • 中:今日の記念日を最大5件表示します。
  • 専用レイアウトは小・中サイズです。すべての記念日を一度に表示するものではありません。

設定手順

上から順に進めてください。コードの保存と設定のコピーに必要な操作欄は、それぞれの手順の中にあります。

  1. Scriptableを用意する

    App StoreでScriptableを開き、iPhoneにインストールします。すでに入っている場合は次へ進んでください。

  2. コードをコピーして保存する

    下のコード欄の「コピー」を押します。Scriptableへ移動し、「+」から新しいスクリプトを作ってコード全文を貼り付け、今日は何の日?などの名前で保存してください。

    保存したらこのページに戻り、次の手順へ進みます。

    // Version: 1.0.0
    // =====================================================
    // 今日は何の日? - Scriptable Widget
    // 小・中サイズ対応
    //
    // ・今日の日付から記念日を自動取得
    // ・APIキー不要
    // ・小サイズ:最大2件
    // ・中サイズ:最大5件
    // =====================================================
    
    
    // =====================================================
    // 設定
    // =====================================================
    
    const CONFIG = {
      background: new Color("#F7F5F0"),
      text: new Color("#222222"),
      subText: new Color("#777777"),
      accent: new Color("#E66B55"),
    
      refreshMinutes: 180
    };
    
    
    // =====================================================
    // 今日の日付
    // =====================================================
    
    const now = new Date();
    
    const month = now.getMonth() + 1;
    const day = now.getDate();
    
    const weekdays = [
      "日", "月", "火", "水", "木", "金", "土"
    ];
    
    const weekday = weekdays[now.getDay()];
    
    
    // API用 0918形式
    
    const mmdd =
      String(month).padStart(2, "0") +
      String(day).padStart(2, "0");
    
    
    // =====================================================
    // 記念日取得
    // =====================================================
    
    let events = [];
    
    try {
    
      const url =
        `https://api.whatistoday.cyou/v3/anniv/${mmdd}`;
    
      const req = new Request(url);
    
      req.timeoutInterval = 10;
    
      const data = await req.loadJSON();
    
    
      // anniv1〜anniv5を取得
    
      for (let i = 1; i <= 5; i++) {
    
        const value = data[`anniv${i}`];
    
        if (
          value &&
          typeof value === "string" &&
          value.trim() !== ""
        ) {
    
          events.push(value.trim());
    
        }
    
      }
    
    } catch (error) {
    
      console.log(
        "記念日データ取得エラー:" + error
      );
    
    }
    
    
    // =====================================================
    // 取得失敗時
    // =====================================================
    
    if (events.length === 0) {
    
      events = [
        "記念日データを取得できませんでした"
      ];
    
    }
    
    
    // =====================================================
    // ウィジェット
    // =====================================================
    
    const widget = new ListWidget();
    
    widget.backgroundColor = CONFIG.background;
    
    
    // 3時間ごとに更新
    
    widget.refreshAfterDate =
      new Date(
        Date.now() +
        CONFIG.refreshMinutes * 60 * 1000
      );
    
    
    const family =
      config.widgetFamily || "medium";
    
    
    // =====================================================
    // SMALL
    // =====================================================
    
    if (family === "small") {
    
      widget.setPadding(
        16,
        16,
        16,
        16
      );
    
    
      // 日付
    
      const dateText =
        widget.addText(
          `${month}月${day}日(${weekday})`
        );
    
      dateText.font =
        Font.mediumSystemFont(12);
    
      dateText.textColor =
        CONFIG.subText;
    
    
      widget.addSpacer(7);
    
    
      // タイトル
    
      const title =
        widget.addText(
          "今日は何の日?"
        );
    
      title.font =
        Font.boldSystemFont(20);
    
      title.textColor =
        CONFIG.text;
    
    
      widget.addSpacer();
    
    
      // 記念日
    
      const max =
        Math.min(events.length, 2);
    
      for (
        let i = 0;
        i < max;
        i++
      ) {
    
        const row =
          widget.addStack();
    
        row.layoutHorizontally();
        row.centerAlignContent();
    
    
        // ●
    
        const dot =
          row.addText("●");
    
        dot.font =
          Font.systemFont(7);
    
        dot.textColor =
          CONFIG.accent;
    
    
        row.addSpacer(7);
    
    
        // 記念日名
    
        const text =
          row.addText(events[i]);
    
        text.font =
          Font.semiboldSystemFont(13);
    
        text.textColor =
          CONFIG.text;
    
        text.lineLimit = 2;
    
    
        if (i < max - 1) {
    
          widget.addSpacer(8);
    
        }
    
      }
    
    
      widget.addSpacer();
    
    }
    
    
    // =====================================================
    // MEDIUM
    // =====================================================
    
    else {
    
      widget.setPadding(
        18,
        20,
        18,
        20
      );
    
    
      // 上部
    
      const header =
        widget.addStack();
    
      header.layoutHorizontally();
      header.centerAlignContent();
    
    
      // 日付
    
      const dateText =
        header.addText(
          `${month}月${day}日(${weekday})`
        );
    
      dateText.font =
        Font.mediumSystemFont(13);
    
      dateText.textColor =
        CONFIG.subText;
    
    
      header.addSpacer();
    
    
      // TODAY
    
      const today =
        header.addText("TODAY");
    
      today.font =
        Font.boldSystemFont(10);
    
      today.textColor =
        CONFIG.accent;
    
    
      widget.addSpacer(6);
    
    
      // タイトル
    
      const title =
        widget.addText(
          "今日は何の日?"
        );
    
      title.font =
        Font.boldSystemFont(24);
    
      title.textColor =
        CONFIG.text;
    
    
      widget.addSpacer(12);
    
    
      // 記念日一覧
    
      const max =
        Math.min(events.length, 5);
    
      for (
        let i = 0;
        i < max;
        i++
      ) {
    
        const row =
          widget.addStack();
    
        row.layoutHorizontally();
        row.centerAlignContent();
    
    
        // ●
    
        const dot =
          row.addText("●");
    
        dot.font =
          Font.systemFont(7);
    
        dot.textColor =
          CONFIG.accent;
    
    
        row.addSpacer(8);
    
    
        // 記念日
    
        const text =
          row.addText(events[i]);
    
        text.font =
          Font.semiboldSystemFont(14);
    
        text.textColor =
          CONFIG.text;
    
        text.lineLimit = 1;
    
    
        if (i < max - 1) {
    
          widget.addSpacer(6);
    
        }
    
      }
    
    
      widget.addSpacer();
    
    }
    
    
    // =====================================================
    // 完了
    // =====================================================
    
    Script.setWidget(widget);
    
    
    // Scriptable内で実行した場合のプレビュー
    
    if (!config.runsInWidget) {
    
      if (family === "small") {
    
        await widget.presentSmall();
    
      } else {
    
        await widget.presentMedium();
    
      }
    
    }
    
    
    Script.complete();
  3. ホーム画面に追加して設定する

    iPhoneのホーム画面を長押しし、ウィジェット追加画面からScriptableを選びます。この記事の対応サイズの説明に合わせてサイズを選んで追加してください。

    追加したウィジェットを長押しして「ウィジェットを編集」を開き、「Script」に保存したスクリプトを選びます。

    「Parameter」は空欄で構いません。

    編集画面を閉じて表示を確認します。ホーム画面への反映には少し時間がかかる場合があります。

記念日は毎日自動で更新

現在の日付をScriptable側で取得しているため、自分で日付を設定する必要はありません。
今日が9月18日なら9月18日の記念日、翌日になれば9月19日の記念日へ自動的に切り替わります。
ウィジェットは定期的に情報を更新するよう設定されているので、一度ホーム画面に設置すれば基本的にはそのままでOKです。 

動作確認・使用結果

確認した端末 iPhone 17 ProMAX
iOS iOS27
Scriptable 1.7.19
確認したサイズ 小・中
バージョン 1.0.0
動作確認日 2026-09-18

表示・使用時のポイント

その日の月日を使って記念日APIを検索します。件数が多い日はサイズごとの上限まで表示します。

更新履歴

1.0.0

  • 初回リリース

よくあるエラーと対処

確認すること
表示されない場合は、ウィジェット編集画面の「Script」に保存したスクリプトが選ばれているかも確認してください。コードを貼り直すときは全文を置き換えます。
記念日を取得できない
通信を確認してScriptableで実行してください。APIの応答がない場合は時間を置いて再実行します。
知っている記念日が表示されない
APIの収録内容と表示件数の上限によります。記念日の全件一覧ではありません。

注意事項・制限

  • 記念日の名称や説明は取得先のデータに基づきます。祝日だけの一覧ではありません。
  • 日付が変わった直後は、ホーム画面に前日の内容が残る場合があります。
  • ホーム画面の更新タイミングはiOSが管理するため、操作やデータの変更がすぐに反映されない場合があります。

データ提供・参考資料

今日は何の日?記念日API:当日の月日を指定して記念日データを取得します。

SHARE

この記事をシェア