Google Apps Scriptを使ってプロ野球の試合状況をメールで知らせる

Pocket

以前、「Google Apps Scriptを使って運行状況をメールで知らせる」という記事を書きましたが、同じ仕組みを使って、今回はプロ野球の試合状況をメールで知らせる方法を紹介します。

使い方

  1. Googleドライブでスプレッドシートを新規に作成します。
  2. メニューの ツール - スクリプトエディタ で空のプロジェクトを作ります。
  3. 下のコードを貼り付けます。
    • {メールアドレス}を自分のメールアドレスに変えます。
    • {チーム}を取得したいチーム名に変えます。「巨人」「ヤクルト」「DeNA」「中日」「阪神」「広島」「日本ハム」「楽天」「西武」「ロッテ」「オリックス」「ソフトバンク」のいずれかです。
  4. メニューの リソース - 現在のプロジェクトのトリガー でトリガーを設定します。私は「15分ごと」にしています。

説明

  1. 実行すると13時から24時の間だけ処理されます。
  2. Yahoo!からプロ野球の得点状況を全試合分(最大6試合)、取得します。
  3. スプレッドシートに得点状況をセットします。
  4. 次に処理されるとき、前回の得点状況と今回の得点状況を比較します。
  5. 指定したチームの状況に変化があればセット(上書き)し、得点状況をメール送信します。

情報の取得が面倒、変化があるときだけメール送信、という理由からコードが長くなっています。

コード

function send_npb_mail() {
  var my_team, url, mail, title, result, html, lines;
  var gamenum, games, i, m, infos, info_new, sheet, info_old, this_info;
  my_team = "{チーム}";
  mail = "{メールアドレス}";
  url = "http://baseball.yahoo.co.jp/npb/schedule/";
  title = "プロ野球得点メール";
 
  td=new Date();
  this_hour=td.getHours();
  Logger.log(this_hour);
  if(this_hour<13){
    return;
  }
  //情報を取得
  result = UrlFetchApp.fetch(url);
  html = result.getContentText();
  lines = html.split(/\n/);
  gamenum = -1;
  games = [];
  for(i = 0; i < lines.length; i++) {
    if(lines[i].match(/<table.*class="teams">/)) {
      gamenum++;
      games[gamenum] = [];
      games[gamenum].teams = [];
      games[gamenum].runs = [];
    }
    if(gamenum > -1) {
      m = lines[i].match(/<a.*\/npb\/teams\/.*>(.*)<\/a>/);
      if(m) { //チーム名の取得
        games[gamenum].teams.push(m[1]);
      }
      m = lines[i].match(/<td class="score_r">.*?([0-9\-]+).*?<\/td>/);
      if(m) { //得点の取得
        games[gamenum].runs.push(m[1]);
      }
    }
  }
  if(games.length<1){//試合がない場合は処理しない。
    return;
  }
  infos = [];
  for(i = 0; i < games.length; i++) {
    infos.push(games[i].teams[0] + games[i].runs[0] + "-" + games[i].runs[1] + games[i].teams[1]);
  }
  info_new = infos.join(";");
  //ログを取得
  sheet = SpreadsheetApp.getActiveSheet();
  info_old = sheet.getRange(1, 1).getValue();
  if(info_new !== info_old) {
    this_info = team_info(my_team, info_old, info_new);
    if(this_info !== "") {
      MailApp.sendEmail(mail, this_info, info_new.replace(/;/g, "\n"));
    }
    sheet.getRange(1, 1).setValue(info_new);
  }
}

function team_info(my_team, info_old, info_new) {
  //指定チームの試合状況に変更があれば新しい試合状況を返す。
  //変更がなければ空文字を返す。
  //第2,第3引数は「ヤクルト2-6DeNA;巨人0-1中日」という文字列。
  var olds, news, old_one, new_one, i;
  olds = info_old.split(/;/);
  news = info_new.split(/;/);
  old_one = "";
  new_one = "";
  for(i = 0; i < olds.length; i++) {
    if(olds[i].match(my_team)) {
      old_one = olds[i];
    }
  }
  for(i = 0; i < news.length; i++) {
    if(news[i].match(my_team)) {
      new_one = news[i];
    }
  }
  if(old_one != new_one) {
    return new_one;
  } else {
    return "";
  }
}

[ 2016年6月18日 | カテゴリー: デジタル | タグ: , , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報