GASでニュースを自動収集!Googleニュースからスプレッドシートに毎日の情報を取得

毎日のニュース情報を整理したいものの、情報収集に時間がかかってしまうことありませんか?

手作業でニュースサイトを巡回するとなると手間もかかります。

そこで、今回は、Google Apps Script(GAS)を使って、Googleニュースの情報をスプレッドシートに取得する方法をご紹介します。

Googleニュースはさまざまなニュースサイトの記事が集められているため、幅広い情報収集が可能です。

このスクリプトを使うことで、複数のニュースサイトを確認することなく手軽にニュースを管理できます。

国やカテゴリー別で取得したり、特定のキーワードでフィルタリングも可能です。

目次

完成イメージ

Googleニュースから以下の情報を取得

A列:ニュースタイトル
B列:リンク
C列:公開日

スプレッドシート内で国、カテゴリー、キーワードを指定し、GoogleニュースRSSを使って取得したニュース情報が表示されます。

GoogleニュースRSSについて

GoogleニュースRSSは、Googleニュースが提供する最新のニュース記事を特定のトピックや国別に、フィード形式で取得するための機能です。

フィード形式は、ニュースサイトやブログなどのウェブサイトが更新されたとき、その更新情報を自動的に配信する仕組みです。

これにより、わざわざ各ニュースサイトを手作業で巡回しなくても、新しい記事を効率よく受け取ることができます。

RSS(Really Simple Syndication)は、このフィード形式の一例で、これを活用することで、興味のあるニュースを一括して受け取ったり、スプレッドシートなど他のツールに連携したりして、情報をより管理しやすくなります。

手順

スプレッドシートの準備

STEP
スプレッドシートを開く

シート名を「ニュース」に設定します。

スクリプトを実行時にこのシート名を参照します。

STEP
スプレッドシートに項目を入力

スプレッドシートに以下の項目名を入力します。

項目名
A1
A2カテゴリー
A3キーワード
A5タイトル
B5リンク
C5公開日
STEP
スプレッドシートに条件を入力

次に取得するニュースの条件を入力します。

条件入力
B1JP,USなどの国コード
B2Business、Technologyなど
B3特定のキーワード

キーワードを特に指定しない場合は、国、カテゴリーのみでニュースを取得します。

今回のスクリプトで取得できる国やカテゴリーは以下の通りです。

スクリプトに使用するため英語で入力する必要があります。

指定可能な国とカテゴリー

  • JP (日本)
  • US (アメリカ)
  • FR (フランス)
  • DE (ドイツ)
  • ES (スペイン)
  • IT (イタリア)
  • KR (韓国)
  • CN (中国)
カテゴリー(セクション)
  • Nation (国内)
  • World (世界)
  • Business (ビジネス)
  • Politics (政治)
  • Science (科学)
  • Technology (テクノロジー)
  • Entertainment (エンタメ)
  • Sports (スポーツ)

国やカテゴリーはプルダウンメニューで選択できるようにすると便利です。

プルダウンメニューを設定することで入力ミスを防ぎ、変更も簡単に行えます。

プルダウンメニューの作成方法
  1. プルダウンメニューを作成したいセルを選択(例:B1セル)。
  2. 右クリックして、表示されるメニューから「プルダウン」を選択
  3. 画面右側に表示された「データの入力規則」のアイテム欄に国コードを入力します。
  4. 「別のアイテムを追加」を選択して、他の国コードも追加していきます。
  5. 入力し終えたら、完了をクリックします。

GASの実行

STEP
GASエディタを開く

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

STEP
GASスクリプトの作成

function myFunction(){

}

が最初から入っているため、消去して以下のスクリプトを貼り付けます。

function fetchGoogleNewsByCountryAndSection() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ニュース");
  
  // スプレッドシートから国とセクション、キーワードの値を取得
  const country = sheet.getRange("B1").getValue().toString().toUpperCase(); // 例: "JP"
  const section = sheet.getRange("B2").getValue().toString().toUpperCase(); // 例: "WORLD"
  const keyword = sheet.getRange("B3").getValue().toString(); // 例: "テクノロジー"

  // 国名コードに応じた言語設定を行う
  let language = 'en'; // デフォルトは英語
  if (country === 'JP') {
    language = 'ja';
  } else if (country === 'FR') {
    language = 'fr';
  } else if (country === 'DE') {
    language = 'de';
  } else if (country === 'ES') {
    language = 'es';
  } else if (country === 'IT') {
    language = 'it';
  } else if (country === 'KR') {
    language = 'ko';
  } else if (country === 'CN') {
    language = 'zh-CN';
  }

  // RSSフィードURLの構成
  const rssUrl = `https://news.google.com/rss/headlines/section/topic/${section}?hl=${language}&gl=${country}&ceid=${country}:${language}`;
  
  // RSSフィードの取得
  const response = UrlFetchApp.fetch(rssUrl);
  const xml = XmlService.parse(response.getContentText());
  const root = xml.getRootElement();
  const channel = root.getChild("channel");
  const items = channel.getChildren("item");

  // ニュース記事のデータを開始位置(A6から)に書き込み
  if (sheet.getLastRow() > 5) {
    sheet.getRange(6, 1, sheet.getLastRow() - 5, 3).clearContent(); // A列からC列までをクリア
  }

  // ニュース記事のタイトル、リンク、公開日を書き込む
  let rowIndex = 6;
  items.forEach(item => {
    const title = item.getChildText("title");
    const link = item.getChildText("link");
    const pubDate = item.getChildText("pubDate");

    // キーワードフィルタリング(キーワードが入力されている場合のみ)
    if (keyword && !title.includes(keyword)) {
      return; // キーワードがタイトルに含まれていない場合はスキップ
    }

    sheet.getRange(rowIndex, 1).setValue(title);  // タイトル(A列)
    sheet.getRange(rowIndex, 2).setValue(link);   // リンク(B列)
    sheet.getRange(rowIndex, 3).setValue(pubDate); // 公開日(C列)
    rowIndex++;
  });
}
スクリプトの説明
国、カテゴリー、キーワードの取得
function fetchGoogleNewsByCountryAndSection() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ニュース");
  
  // スプレッドシートから国とセクション、キーワードの値を取得
  const country = sheet.getRange("B1").getValue().toString().toUpperCase(); // 例: "JP"
  const section = sheet.getRange("B2").getValue().toString().toUpperCase(); // 例: "WORLD"
  const keyword = sheet.getRange("B3").getValue().toString(); // 例: "テクノロジー"
  • スプレッドシートのシート名「ニュース」を参照します。
  • スプレッドシートのB1、B2、B3セルから国(例: JP)、カテゴリー(例: WORLD)、キーワード(例: テクノロジー)を取得します。
  • 国名コードを取得し、それに基づいて表示する言語を決定します(例: USなら英語、JPなら日本語)。
RSSフィードの構成
  // 国名コードに応じた言語設定を行う
  let language = 'en'; // デフォルトは英語
  if (country === 'JP') {
    language = 'ja';
  } else if (country === 'FR') {
    language = 'fr';
  } else if (country === 'DE') {
    language = 'de';
  } else if (country === 'ES') {
    language = 'es';
  } else if (country === 'IT') {
    language = 'it';
  } else if (country === 'KR') {
    language = 'ko';
  } else if (country === 'CN') {
    language = 'zh-CN';
  }

  // RSSフィードURLの構成
  const rssUrl = `https://news.google.com/rss/headlines/section/topic/${section}?hl=${language}&gl=${country}&ceid=${country}:${language}`;
  
  • 取得した国とカテゴリーの情報をもとに、GoogleニュースRSSフィードのURLを作成します。
  • hl(言語)とgl(地域)のパラメータを動的に設定することで、特定の国のニュースを特定の言語で取得できるようにしています。
ニュース記事の取得
  // RSSフィードの取得
  const response = UrlFetchApp.fetch(rssUrl);
  const xml = XmlService.parse(response.getContentText());
  const root = xml.getRootElement();
  const channel = root.getChild("channel");
  const items = channel.getChildren("item");
  
  • UrlFetchApp.fetch()関数を使って、作成したRSSフィードURLからニュースデータを取得します。
  • XML形式で取得したデータを解析し、ニュースのタイトル、リンク、公開日などを抽出します。
スプレッドシートへの書き込み
  // ニュース記事のデータを開始位置(A6から)に書き込み
  if (sheet.getLastRow() > 5) {
    sheet.getRange(6, 1, sheet.getLastRow() - 5, 3).clearContent(); // A列からC列までをクリア
  }

  // ニュース記事のタイトル、リンク、公開日を書き込む
  let rowIndex = 6;
  items.forEach(item => {
    const title = item.getChildText("title");
    const link = item.getChildText("link");
    const pubDate = item.getChildText("pubDate");

    // キーワードフィルタリング(キーワードが入力されている場合のみ)
    if (keyword && !title.includes(keyword)) {
      return; // キーワードがタイトルに含まれていない場合はスキップ
    }

    sheet.getRange(rowIndex, 1).setValue(title);  // タイトル(A列)
    sheet.getRange(rowIndex, 2).setValue(link);   // リンク(B列)
    sheet.getRange(rowIndex, 3).setValue(pubDate); // 公開日(C列)
    rowIndex++;
  });
}
  • 取得したニュース記事のデータを、スプレッドシートのA6セル以降に書き込みます。
  • 既存のデータをクリアし、新たに取得したニュース情報を順次書き込んでいきます。
  • キーワードが設定されている場合は、ニュースタイトルにそのキーワードが含まれている記事のみを表示します。
STEP
スクリプトを保存

スクリプトを書いたら、名前を付けて保存します。

(例:「Googleニュース」)

STEP
スクリプトを実行

スクリプトを実行してニュースを取得します。

初めてそのスクリプトを実行する場合は権限の確認が必要です。

そのため、『権限を確認』を押します。

許可の詳細手順

「詳細」をクリックします。

無題のプロジェクト(安全ではないページ)に移動」をクリックします。

許可」をクリックします。

STEP
ニュース情報が反映

スプレッドシートの5行目以降にニュース情報が反映されます。

国やカテゴリーを変更して、繰り返しスクリプトを実行する場合は、スクリプト用のボタンを設置すると取得が簡単になります。

トリガー設定で決まったタイミングで自動収集

自動的にニュースを取得するためには「トリガー」を設定します。

これにより、指定した時間に自動的にスクリプトが実行され、最新のニュース情報が取得されます。

トリガー設定の方法

STEP
GASエディタを開く
先ほどと同様の手順です。

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

STEP
トリガー(時計アイコン)をクリック

トリガーアイコン(時計アイコン)をクリックします。

STEP
新しいトリガーを追加

トリガーを追加」ボタンを押し、以下のように設定します。

  • 実行する関数を選択: fetchGoogleNewsByCountryAndSection
  • 実行のデプロイを選択: Head
  • イベントの種類を選択: 「時間主導型」
  • 時間ベースのトリガー: 「日付ベースのタイマー」
  • 時刻を選択: 例えば「毎日午前9時」に設定することで、毎朝自動的にニュースを取得できます。

まとめ

このGASを使うことで、手作業でニュースサイトを巡回する手間を省くことができます。

また、特定のキーワードで記事をフィルタリングできるため、効率的にニュース情報を取得できます。

日々の情報収集をする際にご活用ください。

弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。

GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。

また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。

貴方の業務改善を全力でサポートいたします。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次