【コピペでOK】特定キーワードの最新ニュースをSlackに自動通知!GASを使った情報収集の完全自動化ガイド

業務改善

フリーランスや経営者の皆さん、毎日の情報収集にどれくらいの時間をかけていますか?「業界の最新動向を追いかけたい」「競合他社のニュースを見逃したくない」と思いながらも、大量のニュースサイトを巡回するのは大変ですよね。気づけば1時間以上も費やしていたり、うっかり重要な情報を見逃してしまったり…。そんな悩みを抱えているあなたに朗報です。この記事では、Googleの無料ツール「Google Apps Script(GAS)」を使って、指定したキーワードを含む最新ニュースを自動でSlackに通知する仕組みを、30分で構築する方法を解説します。プログラミング経験がなくても大丈夫!コピペで使えるコードも用意したので、「これなら自分でもできそう!」と感じていただけるはずです。面倒な情報収集はロボットに任せて、あなたはもっと創造的な仕事に集中しましょう!

今回作成する自動化の全体像

これから作成する仕組みは、以下の流れで動作します。私たちが設定したキーワードに合致するニュースだけを、自動で集めてSlackに届けてくれる、賢い情報収集アシスタントです。

graph TD
    A[Step 1: 定期的に自動起動] --> B(Step 2: ニュースサイトのRSSから最新記事を取得);
    B --> C{Step 3: 記事に指定キーワードは含まれる?};
    C -- Yes --> D[Step 4: キーワードに合致したニュースをSlackに通知];
    C -- No --> E(何もしない);
    D --> F(完了);
    E --> F;

ステップ0:事前準備

本格的な作業に入る前に、以下の3つを準備しておきましょう。これさえあれば、すぐにチュートリアルを始められます。

  • Googleアカウント
    Google Apps Scriptを利用するために必須です。Gmailなどをお使いであれば、そのアカウントで大丈夫です。
  • Slackアカウント
    ニュースの通知を受け取りたいSlackワークスペースのアカウントです。無料プランでも問題ありません。
  • Slack Incoming Webhook URL
    GASからSlackへメッセージを投稿するための「専用のURL」です。以下の手順で簡単に取得できます。
    1. 通知したいSlackチャンネルで、チャンネル名をクリックし、「インテグレーション」タブを開きます。
    2. 「アプリを追加する」をクリックします。
    3. 検索窓で「Incoming Webhooks」と入力し、「追加」ボタンを押します。
    4. 「Slackに追加」→「投稿先のチャンネルを選択」で通知したいチャンネルを選び、「Incoming Webhookインテグレーションの追加」をクリックします。
    5. 表示された「Webhook URL」をコピーして、メモ帳などに大切に保管してください。このURLは外部に漏れないよう注意しましょう。

ステップ・バイ・ステップ構築ガイド

準備が整ったら、いよいよ自動化の仕組みを構築していきます。一つ一つのステップを丁寧に進めていきましょう。

Step1:Google Apps Script プロジェクトの準備

まずは、自動化プログラムを設置する場所を用意します。

  1. Googleドライブ(https://drive.google.com/)を開きます。
  2. 左上の「+ 新規」ボタンをクリックし、「その他」→「Google Apps Script」を選択します。もし見つからない場合は、「アプリを追加」から検索して追加してください。
  3. 新しいプロジェクトが作成されたら、左上の「無題のプロジェクト」をクリックし、分かりやすい名前(例:「ニュース自動通知ボット」)に変更して「名前を変更」をクリックします。

これで、スクリプトを書き込む準備が整いました。

Step2:ニュースを収集・通知するスクリプトを記述する

次に、メインとなるプログラムを記述します。以下のコードをすべてコピーし、エディタに表示されている既存のコード(function myFunction() { ... })をすべて消してから貼り付けてください。

// ▼▼▼ ここから設定項目 ▼▼▼

// 1. ニュースを取得したいサイトのRSSフィードURL
// 例:Yahoo!ニュース トピックス
const RSS_URL = 'https://news.yahoo.co.jp/rss/topics/top-picks.xml';

// 2. Slackに通知するためのIncoming Webhook URL(ステップ0で取得したもの)
const SLACK_WEBHOOK_URL = 'ここにあなたのWebhook URLを貼り付け';

// 3. 探したいキーワード(複数指定する場合は | で区切る。例: '競合A|新技術')
const KEYWORDS = '自動化|業務効率化';

// 4. 通知済み記事を記録するためのシート名
const SHEET_NAME = '通知済み記事リスト';

// ▲▲▲ ここまで設定項目 ▲▲▲

// メインの処理を実行する関数
function main() {
  try {
    const response = UrlFetchApp.fetch(RSS_URL);
    const xml = response.getContentText();
    const document = XmlService.parse(xml);
    const root = document.getRootElement();
    const channel = root.getChild('channel');
    const items = channel.getChildren('item');

    const notifiedLinks = getNotifiedLinks();
    const newLinks = [];

    for (let i = 0; i < items.length; i++) {
      const title = items[i].getChild('title').getText();
      const link = items[i].getChild('link').getText();

      // すでに通知済みのリンクはスキップ
      if (notifiedLinks.includes(link)) {
        continue;
      }

      // キーワードが含まれているかチェック
      const regex = new RegExp(KEYWORDS, 'i'); // iは大文字小文字を区別しない
      if (regex.test(title)) {
        // Slackに通知
        sendToSlack(`【新着ニュース】\n${title}\n${link}`);
        newLinks.push([link]); // 通知した記事のリンクを記録
      }
    }

    // 新しく通知した記事のリンクをスプレッドシートに追記
    if (newLinks.length > 0) {
      recordNotifiedLinks(newLinks);
    }

  } catch (e) {
    console.error('エラーが発生しました: ' + e.toString());
    sendToSlack('ニュース収集ボットでエラーが発生しました。\n' + e.toString());
  }
}

// Slackにメッセージを送信する関数
function sendToSlack(message) {
  const payload = {
    'text': message
  };

  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };

  UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
}

// 通知済みの記事リンクをスプレッドシートから取得する関数
function getNotifiedLinks() {
  const sheet = getSheet();
  if (sheet.getLastRow() === 0) {
    return [];
  }
  return sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues().flat();
}

// 通知した記事リンクをスプレッドシートに記録する関数
function recordNotifiedLinks(links) {
  const sheet = getSheet();
  sheet.getRange(sheet.getLastRow() + 1, 1, links.length, 1).setValues(links);
}

// スプレッドシートを取得または作成する関数
function getSheet() {
  try {
    const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    return spreadsheet.getSheetByName(SHEET_NAME) || spreadsheet.insertSheet(SHEET_NAME);
  } catch (e) {
    // スプレッドシートが紐付いていない場合、新しく作成する
    const newSpreadsheet = SpreadsheetApp.create('ニュース通知ログ');
    console.log(`新しいスプレッドシートを作成しました: ${newSpreadsheet.getUrl()}`);
    PropertiesService.getScriptProperties().setProperty('spreadsheetId', newSpreadsheet.getId());
    return newSpreadsheet.insertSheet(SHEET_NAME);
  }
}

貼り付けたら、コード上部の「設定項目」をあなた自身の情報に書き換えてください。

  1. `RSS_URL`: 情報を取得したいニュースサイトのRSSフィードURLを入力します。今回はYahoo!ニュースを例にしていますが、お好きなサイトのURLに変更可能です。
  2. `SLACK_WEBHOOK_URL`: 「ステップ0」で取得したあなたのWebhook URLを `’ ‘` の間に貼り付けます。
  3. `KEYWORDS`: 収集したいニュースのキーワードを指定します。複数のキーワードを指定したい場合は、`’競合A|新技術’` のように `|`(半角のパイプ)で区切ってください。

書き換えたら、必ずフロッピーディスクのアイコン(プロジェクトを保存)をクリックして保存しましょう。

Step3:スクリプトの実行許可と初回テスト

プログラムがGoogleのサービスや外部のSlackと連携できるよう、許可を与えます。

  1. エディタの上部にある関数選択プルダウンが `main` になっていることを確認し、隣の「実行」ボタンをクリックします。
  2. 「承認が必要です」というダイアログが表示されるので、「権限を確認」をクリックします。
  3. 自分のGoogleアカウントを選択します。
  4. 「このアプリはGoogleで確認されていません」という警告画面が表示されたら、左下の「詳細」をクリックし、「ニュース自動通知ボット(安全ではないページ)に移動」をクリックします。
  5. 最後に表示される画面で、右下の「許可」ボタンをクリックします。

これでスクリプトが実行され、設定したキーワードに合致する最新ニュースがあれば、Slackに通知が届くはずです。一度、Slackを確認してみましょう!

Step4:定期的に自動実行するトリガーを設定

最後の仕上げです。このプログラムを毎日決まった時間に自動で実行するように設定します。

  1. GASエディタの左側メニューから、目覚まし時計のアイコン「トリガー」をクリックします。
  2. 右下の「トリガーを追加」ボタンをクリックします。
  3. 以下の通りに設定します。
    ・実行する関数を選択: `main`
    ・実行するデプロイを選択: `Head`
    ・イベントのソースを選択: `時間主導型`
    ・時間ベースのトリガーのタイプを選択: `日付ベースのタイマー`
    ・時刻を選択: `午前8時~9時` (お好きな時間帯を選んでください)
  4. 「保存」ボタンをクリックします。

これで設定完了です!毎日指定した時間になると、スクリプトが自動で実行され、あなたの代わりに最新ニュースをチェックしてSlackに報告してくれます。

まとめ:自動化で生まれた時間を、もっと創造的な仕事に

お疲れ様でした!これで、あなたは自分専用の「ニュース収集アシスタント」を手に入れました。毎日の情報収集という単純作業から解放され、1日15分、月にすれば数時間の貴重な時間を生み出すことができます。生まれた時間は、事業計画を練ったり、新しいアイデアを考えたり、クライアントとのコミュニケーションを深めたりと、あなたにしかできない、もっと創造的な仕事に使いましょう。今回の自動化に慣れたら、次は「問い合わせフォームへの自動返信」や「SNS投稿の自動化」など、他の業務ハックにもぜひ挑戦してみてください。あなたのビジネスは、ITの力でもっと加速するはずです!


免責事項:本記事で紹介している手順やコードは、執筆時点での情報に基づいています。各サービスの仕様変更により、同様の手順で動作しない可能性があります。また、本チュートリアルの実行によって生じたいかなる損害についても、当方は一切の責任を負いかねます。ご自身の責任において、バックアップを取るなどの対策の上、実行してください。

タイトルとURLをコピーしました