🔧

【GAS】Yahooで検索した結果を自分宛にメールで送る方法

2021/11/25に公開

はじめに

この記事は、作業効率化のために GAS を活用されていて、スクレイピングした結果をメールで送りたいッという方向けの記事になります。

標準機能の紹介ではなく、個人的に作成したスクリプトの共有となりますので、実装方法のひとつとして参考になれば幸いです!

実装方法

実行するコード

function sendMail() {
  const arr = search("React.js OR Next.js");
  const mailAddress = Session.getActiveUser().getUserLoginId();
  let body = "<h1>React.js関連情報</h1>";
  body += arr
    .map((item) => {
      return `<p><a href="${item.url}" alt="data">${item.title}</a></p>`;
    })
    .join("");
  MailApp.sendEmail({
    to: mailAddress,
    subject: "React.js関連情報",
    htmlBody: body,
  });
}

今回作成した関数

関数本体

function search(word, option = {}) {
  let result = [];
  const defaultOption = {
    x: "wrt",
    aq: -1,
    ai: "",
    ei: "UTF-8",
    vd: "w",
    pages: 2,
  };
  const baseOption = { ...defaultOption, ...option };
  const param = Object.keys(baseOption)
    .map((key) => {
      return `${key}=${encodeURI(baseOption[key])}`;
    })
    .join("&");
  const pageCount = baseOption.pages;
  const linkRegexp = /<a href=\"(.*?) .*?ping.*?>.*?<\/a>/gm;
  const urlRegexp = /href=\"(.*?)\"/;
  const titleRegexp = /<a .*?>(.*?)<\/a>/;
  [...new Array(pageCount)].forEach((value, index) => {
    try {
      const searchUrl =
        "https://search.yahoo.co.jp/search?p=" +
        encodeURI(word) +
        "&" +
        param +
        "&b=" +
        (index * 10 + 1);
      const response = UrlFetchApp.fetch(searchUrl);
      const elems = response.getContentText().match(linkRegexp);
      elems.forEach((elem) => {
        const url = elem.match(urlRegexp)[1];
        if (url === "https://www.yahoo.co.jp") return;
        const title = elem.match(titleRegexp)[1];
        result.push({
          url: url,
          title: title
            .replaceAll("<b>", "")
            .replaceAll("</b>", "")
            .replaceAll("<br>", ""),
        });
      });
    } catch (e) {
      Logger.log("NG count: " + index);
    }
  });
  return result;
}

さいごに

今回紹介した関数を使用することで少しでもみなさんの作業効率に繋がればと思いますのでぜひ使用してみたご感想などをお聞かせ頂けると嬉しいです!

また、リファクタリングや代替方法が御座いましたらご教示頂けますと幸いです。

最後まで拙い文章でしたがお付き合い頂きありがとうございました。

参考記事

GitHubで編集を提案

Discussion