今、検索されていること:実機スクショの小・中・大サイズを同じ縮小率で配置したアイキャッチ
設定難易度

「今、検索されていること」は、Googleトレンドで検索が急増しているワードをiPhoneのホーム画面に表示するScriptable用ウィジェットです。気になるワードをタップするとGoogle検索が開き、話題の内容を調べられます。

日本だけでなく、アメリカ・イギリス・韓国など、Googleトレンドがデータを提供している国に切り替えられます。国ごとのウィジェットを並べて、話題の違いを見る使い方もできます。

すべての検索ワードの検索回数ランキングではありません。最近検索が急増した掲載ワードを、検索数の目安が多い順に並べて表示します。

実際のiPhoneの画面を撮影したスクリーンショットです。画像をタップすると拡大できます。

ウィジェットの表示内容

  • 検索数の目安と、データを取得した時刻
  • 対象国の表示と、ワードをタップしたときのGoogle検索
  • 更新に失敗した場合は、前回取得時刻と保存データであることを表示

サイズごとの表示

  • 小サイズ:検索数の目安が最も多い掲載ワード1件
  • 中サイズ:掲載ワードの上位3件
  • 大サイズ:掲載ワードの上位5件

設定手順

  1. Scriptableを用意する

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

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

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

    // Version: 1.1.0
    // 今、検索されていること — 国を選べるGoogleトレンド
    // 小:1件/中:3件/大:5件。Parameter:JP / US / GB / KRなど。空欄は日本。
    // Googleトレンドの掲載ワードを検索数の目安で並べます。
    // 全検索ワードの絶対順位ではありません。
    
    const countryInput = String(args.widgetParameter || '').trim().toUpperCase();
    const countryValid = !countryInput || /^[A-Z]{2}$/.test(countryInput);
    const COUNTRY = countryValid ? (countryInput || 'JP') : 'JP';
    const COUNTRY_NAMES = {JP:'日本',US:'アメリカ',GB:'イギリス',KR:'韓国',TW:'台湾',HK:'香港',CA:'カナダ',AU:'オーストラリア',DE:'ドイツ',FR:'フランス',IN:'インド',BR:'ブラジル',SG:'シンガポール'};
    const COUNTRY_LABEL = COUNTRY_NAMES[COUNTRY] || COUNTRY;
    const FEED_URL = 'https://trends.google.com/trending/rss?geo=' + COUNTRY;
    const TRENDS_URL = 'https://trends.google.com/trending?geo=' + COUNTRY;
    const CACHE_MINUTES = 15;
    const MAX_STALE_HOURS = 6;
    const fm = FileManager.local();
    const cachePath = fm.joinPath(fm.documentsDirectory(), 'geboku-search-trends-' + COUNTRY.toLowerCase() + '-v1.json');
    const C = {text:new Color('18352D'), sub:new Color('6C7D75'), green:new Color('246C58'), pale:new Color('EAF4EE'), line:new Color('DFEAE3')};
    
    function parseTraffic(value) {
      const match = String(value).replace(/,/g,'').trim().match(/^(\d+(?:\.\d+)?)\s*(K|M|B|万|億)?\+?$/i);
      if (!match) return null;
      const scale = {'K':1000,'M':1000000,'B':1000000000,'万':10000,'億':100000000};
      const number = Number(match[1]) * (scale[(match[2] || '').toUpperCase()] || 1);
      return Number.isFinite(number) && number >= 0 ? number : null;
    }
    
    function parseTrends(xml) {
      const parser = new XMLParser(xml);
      const stack = []; const items = [];
      let item = null, field = null, buffer = '', failed = false;
      parser.didStartElement = name => {
    	stack.push(name);
    	if (name === 'item' && stack.join('/') === 'rss/channel/item') item = {};
    	if (item && stack.length === 4 && ['title','ht:approx_traffic','pubDate'].includes(name)) {field = name; buffer = '';}
      };
      parser.foundCharacters = chars => { if (field) buffer += chars; };
      parser.didEndElement = name => {
    	if (field === name && stack.length === 4) {item[field] = buffer.trim(); field = null; buffer = '';}
    	if (name === 'item' && stack.length === 3 && item) {
    	  const volume = parseTraffic(item['ht:approx_traffic']);
    	  if (item.title && volume !== null) items.push({title:item.title, volume, publishedAt:item.pubDate || '', feedIndex:items.length});
    	  item = null;
    	}
    	stack.pop();
      };
      parser.parseErrorOccurred = () => {failed = true;};
      if (!parser.parse() || failed || !items.length) throw new Error('検索トレンドを読み取れませんでした');
      const unique = new Map();
      for (const item of items) if (!unique.has(item.title)) unique.set(item.title,item);
      return Array.from(unique.values()).sort((a,b) => b.volume-a.volume || a.feedIndex-b.feedIndex);
    }
    
    function isCacheValid(value) {
      return value && Number.isFinite(Date.parse(value.fetchedAt)) && Array.isArray(value.items) && value.items.length > 0
    	&& value.items.every(x => x && typeof x.title === 'string' && x.title.length > 0 && Number.isFinite(x.volume) && x.volume >= 0);
    }
    function searchURL(word) {return 'https://www.google.co.jp/search?q=' + encodeURIComponent(word);}
    function volumeLabel(value) {
      if (value >= 100000000) return (value/100000000).toLocaleString('ja-JP',{maximumFractionDigits:1}) + '億+';
      if (value >= 10000) return (value/10000).toLocaleString('ja-JP',{maximumFractionDigits:1}) + '万+';
      return value.toLocaleString('ja-JP') + '+';
    }
    
    let family = config.widgetFamily || 'medium';
    if (!config.runsInWidget) {
      const menu = new Alert(); menu.title = '今、検索されていること';
      menu.message = COUNTRY_LABEL + 'で検索が急増したワードを表示します。国を変える場合はウィジェットのParameterにUSやKRなどを入力してください。';
      menu.addAction('小サイズ'); menu.addAction('中サイズ'); menu.addAction('大サイズ'); menu.addCancelAction('終了');
      const selected = await menu.presentSheet();
      if (selected < 0) {Script.complete(); return;}
      family = ['small','medium','large'][selected];
    }
    let cached = null;
    try {if (fm.fileExists(cachePath)) {const value=JSON.parse(fm.readString(cachePath));if(isCacheValid(value))cached=value;}} catch (_) {}
    let data = null, stale = false;
    const cacheAge = cached ? Date.now()-Date.parse(cached.fetchedAt) : Infinity;
    if (countryValid && config.runsInWidget && cacheAge >= 0 && cacheAge < CACHE_MINUTES*60000) data=cached;
    else if (countryValid) {
      try {
    	const request = new Request(FEED_URL); request.timeoutInterval=15;
    	request.headers = {Accept:'application/rss+xml, application/xml, text/xml'};
    	const xml = await request.loadString();
    	if (!request.response || request.response.statusCode !== 200) throw new Error('取得できませんでした');
    	data = {items:parseTrends(xml),fetchedAt:new Date().toISOString()};
    	try {fm.writeString(cachePath,JSON.stringify(data));} catch (_) {}
      } catch (e) {
    	console.log('トレンド取得エラー:' + e);
    	if (cached && cacheAge >= 0 && cacheAge <= MAX_STALE_HOURS*3600000) {data=cached;stale=true;}
      }
    }
    const widget = new ListWidget();
    widget.backgroundColor=new Color('F8FBF8'); widget.setPadding(14,16,12,16);
    widget.url = data && family==='small' ? searchURL(data.items[0].title) : TRENDS_URL;
    widget.refreshAfterDate=new Date(Date.now()+CACHE_MINUTES*60000);
    function label(parent,value,size=12,bold=false,color=C.text,lines=1) {
      const t=parent.addText(String(value));t.font=bold?Font.boldSystemFont(size):Font.systemFont(size);
      t.textColor=color;t.lineLimit=lines;t.minimumScaleFactor=0.7;return t;
    }
    if (family==='small') {
      label(widget,'今、検索されていること',12,true,C.green,2);
      widget.addSpacer(7);label(widget,COUNTRY_LABEL + ' · 急上昇ワード',9,false,C.sub);
    } else {
      const head=widget.addStack();head.centerAlignContent();
      label(head,'今、検索されていること',15,true,C.green);head.addSpacer();
      label(head,COUNTRY_LABEL,10,true,C.green);
      widget.addSpacer(family==='large'?7:3);
      label(widget,'急上昇ワード · 掲載分を検索数の目安で比較',9,false,C.sub);
    }
    if (!data) {
      widget.addSpacer();label(widget,countryValid ? '取得できませんでした' : '国コードを確認',family==='small'?16:20,true,C.text,2);
      widget.addSpacer(5);label(widget,countryValid ? '通信状態・対象国の提供状況を確認してください' : 'ParameterにJP・US・GBなど\n2文字の国コードを入力',11,false,C.sub,2);widget.addSpacer();
    } else if (family==='small') {
      widget.addSpacer();label(widget,data.items[0].title,23,true,C.text,2);
      widget.addSpacer(5);label(widget,'検索数の目安 ' + volumeLabel(data.items[0].volume),11,true,C.green);
      widget.addSpacer();
    } else {
      widget.addSpacer(family==='large'?16:9);
      const count = family==='large'?5:3;
      data.items.slice(0,count).forEach((item,index)=>{
    	const row=widget.addStack();row.layoutHorizontally();row.centerAlignContent();row.url=searchURL(item.title);
    	const rank=row.addStack();rank.size=new Size(23,23);rank.cornerRadius=7;rank.backgroundColor=index===0?C.green:C.pale;rank.setPadding(3,5,3,5);
    	label(rank,index+1,12,true,index===0?new Color('FFFFFF'):C.green);
    	row.addSpacer(9);
    	label(row,item.title,family==='large'?17:14,true,C.text,family==='large'?2:1);
    	row.addSpacer();row.addSpacer(6);label(row,volumeLabel(item.volume),family==='large'?13:11,true,C.green);
    	if(index < Math.min(count,data.items.length)-1)widget.addSpacer(family==='large'?18:8);
      });
      widget.addSpacer();
      if(family==='large'){label(widget,'各ワードをタップしてGoogle検索',10,false,C.sub);widget.addSpacer(7);}
    }
    const footer=widget.addStack();footer.centerAlignContent();
    label(footer,'Google Trends',8,false,C.sub);footer.addSpacer();
    if(data){const df=new DateFormatter();df.dateFormat=stale?'M/d HH:mm':'HH:mm';label(footer,(stale?'前回 ':'取得 ')+df.string(new Date(data.fetchedAt)),8,false,C.sub);}
    if(stale){widget.addSpacer(3);label(widget,'更新失敗 · 保存データを表示',8,false,C.sub);}
    Script.setWidget(widget);
    if(!config.runsInWidget){if(family==='small')await widget.presentSmall();else if(family==='large')await widget.presentLarge();else await widget.presentMedium();}
    Script.complete();
    
  3. 表示する国を決める

    125カ国・地域で取得を確認しました(2026年10月13日)。下の地域名をタップして一覧を開き、表示したい国の2文字のコードだけを「Parameter」に入力してください。例:アメリカは US、韓国は KR。日本は空欄でも使えます。

    確認したのはウィジェットが利用するRSSの取得と検索ワードの読み取りです。全ての国でiPhoneの実機表示を確認したという意味ではありません。提供状況は変わることがあります。国名の日本語表示が未登録の国は、ウィジェット上では国コードが表示されます。検索ワードは元の言語のままで、自動翻訳はしません。

    アジア・中東(39)
    国・地域 国コード
    アゼルバイジャン AZ
    アラブ首長国連邦 AE
    アルメニア AM
    イエメン YE
    イスラエル IL
    イラク IQ
    イラン IR
    インド IN
    インドネシア ID
    ウズベキスタン UZ
    オマーン OM
    カザフスタン KZ
    カタール QA
    カンボジア KH
    キルギス KG
    クウェート KW
    サウジアラビア SA
    シリア SY
    シンガポール SG
    ジョージア GE
    スリランカ LK
    タイ TH
    トルクメニスタン TM
    トルコ TR
    ネパール NP
    バングラデシュ BD
    バーレーン BH
    パキスタン PK
    パレスチナ自治区 PS
    フィリピン PH
    ベトナム VN
    マレーシア MY
    ミャンマー (ビルマ) MM
    ヨルダン JO
    レバノン LB
    中華人民共和国香港特別行政区 HK
    台湾 TW
    日本 JP
    韓国 KR
    ヨーロッパ(36)
    国・地域 国コード
    アイルランド IE
    アルバニア AL
    イギリス GB
    イタリア IT
    ウクライナ UA
    エストニア EE
    オランダ NL
    オーストリア AT
    キプロス CY
    ギリシャ GR
    クロアチア HR
    スイス CH
    スウェーデン SE
    スペイン ES
    スロバキア SK
    スロベニア SI
    セルビア RS
    チェコ CZ
    デンマーク DK
    ドイツ DE
    ノルウェー NO
    ハンガリー HU
    フィンランド FI
    フランス FR
    ブルガリア BG
    ベラルーシ BY
    ベルギー BE
    ボスニア・ヘルツェゴビナ BA
    ポルトガル PT
    ポーランド PL
    モルドバ MD
    ラトビア LV
    リトアニア LT
    ルーマニア RO
    ロシア RU
    北マケドニア MK
    アフリカ(23)
    国・地域 国コード
    アルジェリア DZ
    アンゴラ AO
    ウガンダ UG
    エジプト EG
    エチオピア ET
    カメルーン CM
    ガーナ GH
    ケニア KE
    コンゴ民主共和国 CD
    コートジボワール CI
    ザンビア ZM
    ジンバブエ ZW
    セネガル SN
    タンザニア TZ
    チュニジア TN
    ナイジェリア NG
    ブルキナファソ BF
    ベナン BJ
    マリ ML
    モザンビーク MZ
    モロッコ MA
    リビア LY
    南アフリカ ZA
    北米・中米・カリブ海(15)
    国・地域 国コード
    アメリカ US
    エルサルバドル SV
    カナダ CA
    キューバ CU
    グアテマラ GT
    コスタリカ CR
    ジャマイカ JM
    トリニダード・トバゴ TT
    ドミニカ共和国 DO
    ニカラグア NI
    ハイチ HT
    パナマ PA
    プエルトリコ PR
    ホンジュラス HN
    メキシコ MX
    南米(10)
    国・地域 国コード
    アルゼンチン AR
    ウルグアイ UY
    エクアドル EC
    コロンビア CO
    チリ CL
    パラグアイ PY
    ブラジル BR
    ベネズエラ VE
    ペルー PE
    ボリビア BO
    オセアニア(2)
    国・地域 国コード
    オーストラリア AU
    ニュージーランド NZ
  4. ホーム画面に追加して設定する

    iPhoneのホーム画面を長押しし、ウィジェット追加画面からScriptableを選び、小・中・大の好きなサイズを追加します。

    ウィジェットを長押しして「ウィジェットを編集」を開き、「Script」に保存したスクリプトを選びます。「Parameter」は日本なら空欄、別の国なら手順3の国コードを入力してください。

    タップ時の動作設定が表示される場合は、スクリプトで指定したURLを開く設定にします。

  5. 表示と検索を確認する

    編集画面を閉じて表示を確認します。小サイズはウィジェット全体、中・大サイズは各ワードの行をタップすると、そのワードをGoogle検索できます。

    Scriptable内で直接実行すると、小・中・大のプレビューを選べます。国ごとのウィジェットを置く場合も、同じScriptを選び、Parameterだけを変えます。

動作確認・使用結果

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

iPhoneのホーム画面で、小・中・大サイズの表示を確認しました。日本・アメリカ・韓国のワードを表示した実機スクリーンショットを掲載しています。RSS取得、実データを使った読み取り処理、並び順、取得エラーの処理、コードの構文も確認しています。

更新履歴

1.1.0

  • Parameterの国コードで対象国を切り替えられるようにしました。
  • 保存データを国ごとに分けました。

1.0.0

  • 初回リリース。日本の急上昇検索ワードの表示とGoogle検索に対応しました。

よくあるエラーと対処

取得できませんでした
通信状態と、その国のRSS提供状況を確認してください。6時間以内の保存データがある場合は、その時刻とともに表示します。
国コードを確認と表示される
ParameterにJP・US・GBなど2文字の国コードを入力してください。日本は空欄でも使えます。
すぐに更新されない
更新要求は15分間隔ですが、ホーム画面の実際の更新タイミングはiOSが決めます。Scriptable内で直接実行すると、新しい取得を試せます。
タップしても検索が開かない
ウィジェット編集画面でScriptが正しく選ばれているか、タップ時の動作が指定URLを開く設定になっているか確認してください。

注意事項・制限

  • Googleトレンドに掲載された急上昇ワードの比較です。すべての検索の絶対順位ではありません。
  • 検索数は概数です。同じ目安のワードはRSSの掲載順に並びます。
  • 取得時刻はウィジェットがデータを取得した時刻です。各話題が発生した時刻ではありません。
  • Google側の提供内容やRSS形式の変更により、取得できなくなる場合があります。
  • 国によってRSSの提供状況が異なります。
  • ホーム画面の更新頻度はiOSの制御を受けます。常時リアルタイムではありません。

データ提供・参考資料

SHARE

この記事をシェア