0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

新聞歌壇への投稿をGASで自動化する

Posted at

はじめに

akamiと申します。趣味で短歌をやっていて、新聞歌壇に応募しています。
新聞歌壇にはメールで短歌を送れば応募できるのですが、これが意外と難しい……。
自分が送っている日経歌壇は、一週間に3首までという制約があり、それなら毎週固定の曜日にメールを送ろう!! とは思うのですが……。
送ったか送ってないか思い出せないし、送った歌も管理できない……。
よし、なら自動化しよう!!

使うもの

  • Googleスプレッドシート
    • 短歌の管理に使用
  • GAS
    • 起動時、短歌を取得し、メールを送信する

Googleスプレッドシートを準備する

Googleスプレッドシートを作成する

スクリーンショット 2024-04-27 23.11.18.png

1行目に各行の役割を書いておく。
「あ」「い」「う」など書いてあるところは、使用時は短歌に置き換えてください。

※注意:メールの送信元となるGoogleアカウントで作成してください。

GoogleスプレッドシートのIDを取得する

作成したGoogleスプレッドシートのURLからIDを取得する

https://docs.google.com/spreadsheets/d/[この部分がID]/edit#gid=0

GAS(Google App Script)を作成

GASのページにアクセスし、「新しいプロジェクト」を選択

スクリーンショット 2024-04-27 23.13.57.png

下記ソースコードを貼り付ける

function myFunction() {
  // スプレッドシートのシート名を指定します
  var sheetName = "シート1"; // シート名を変えている場合はここも書き換える
  var textColumn = 1; // テキスト列の列番号(A列なら1)
  var statusColumn = 2; // 状態列の列番号(B列なら2)
  var dateColumn = 3; // 送信日列の列番号(C列なら3)

  // スプレッドシートを取得します
  var ss = SpreadsheetApp.openById("[スプレッドシートのID]");
  var sheet = ss.getSheetByName(sheetName);
  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();
  
  // 未送信の行を抽出
  var latestRows = [];
  for (var i = 1; i < values.length; i++) {
    if (values[i][statusColumn - 1] === "") {
      latestRows.push(i + 1); // 行番号を1-indexedから0-indexedに変換
      if (latestRows.length >= 3) break; // 3件以上見つかったらループを抜ける
    }
  }
  Logger.log(latestRows);
  // テキストがすべて空欄でないかチェック
  var textNotEmpty = latestRows.some(function(row) {
    return values[row - 1][textColumn - 1] !== ""; // テキストが空欄でない場合はtrueを返す
  });

  // テキストがすべて空欄でない場合のみメール送信
  if (textNotEmpty) {

    // メール本文の作成
    // \nは改行記号です。メール本文の内容は適当にカスタマイズしてください。(内容変えたり行数減らしたり増やしたり)
    var body1 = "メール本文1行目\n" + 
              "メール本文2行目\n" + 
              "メール本文3行目\n" + 
              "メール本文4行目\n" + 
              "メール本文5行目\n" + 
              "\n" + 
              "短歌:\n";

    var body2= "\n\n以上、よろしくお願い致します。\n"; // テキストの後の部分

    var emailBody = body1; // メール本文の初期化

    // 最新の3件のテキストをメール本文に追加
    latestRows.forEach(function(row) {
      var text = values[row - 1][textColumn - 1];
      emailBody += text + "\n"; // テキストをメール本文に追加
    });
    emailBody += body2; // テキストの後の部分をメール本文に追加

    var recipient1 = "[送り先のメールアドレス]"; // 送信先のメールアドレスを指定
    var subject1 = "メールの件名をここに記入";
    MailApp.sendEmail(recipient1, subject1, emailBody);
    var recipient2 = "[転送先のメールアドレス]"; // 転送先のメールアドレスを指定
    var subject2 = "転送:メールの件名をここに記入";
    MailApp.sendEmail(recipient2, subject2, emailBody);

    // 送信日を記入し、状態を「済」に更新
    var today = new Date().toLocaleDateString(); // 今日の日付を取得
    latestRows.forEach(function(row) {
      sheet.getRange(row, dateColumn).setValue(today);
      sheet.getRange(row, statusColumn).setValue("");
    });
  }
}

実行ボタンを押してみる

最初は[送り先アドレス]と[転送先のメールアドレス]に自分のアドレスを設定してテストしてみましょう。
※実行ボタンが押せない場合はCtrl+sで保存してから押してみてください

スクリーンショット 2024-04-27 23.14.492.png

すると、「承認が必要です」ダイアログが出ます。
「権限を確認」を押す。

スクリーンショット 2024-04-27 23.28.23.png

自分のGoogleアカウントを選択し、次に進む。

「詳細」を押す

スクリーンショット 2024-04-27 23.30.52.png

「[プロジェクト名](安全ではないページ)に移動」を押す。

スクリーンショット 2024-04-27 23.322.32.png

スプレッドシートへのアクセス(書き換えたり削除したり作成したり)、メールを送信したりを許可しますか?
という確認のダイアログです。
問題なければ「許可」を押します。

スクリーンショット 2024-04-27 23.34.29.png

これでGASを実行できるようになりました。
再度実行を押します。

実行結果(GAS)

スクリーンショット 2024-04-27 23.27.08.png

実行結果(Googleスプレッドシート)

スクリーンショット 2024-04-27 23.38.18.png

実行結果(Gmail)

スクリーンショット 2024-04-27 23.40.40.png

GASのトリガーを設定する

実行して問題なければ、トリガーを設定します。

スクリーンショット 2024-04-27 23.14.49.png

「+新しいトリガーを追加」からトリガーを追加する。
今回は、週に1回実行したいので、毎週金曜日の午後4時〜5時に実行されるように設定する。

スクリーンショット 2024-04-27 23.45.12.png

おわり

これで、スプレッドシートさえ更新しておけば自動で週に1度送ってくれるはずです。
ちなみに、短歌が1~2首の場合は1~2首で送付、送る短歌が0首のときはメールが送信されない動作になっています。
同じ悩みを持つ方の役に立てれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?