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


## はじめに

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

## 使うもの

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

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

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

![スクリーンショット 2024-04-27 23.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/d0dbbb36-4f44-1592-96cb-1ea2f592dd39.png)

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

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

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

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

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

## GAS（Google App Script）を作成

https://script.google.com

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

![スクリーンショット 2024-04-27 23.13.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/367bb08a-00b3-226d-e958-52101b1d0308.png)

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

```javascript:
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/9d951593-c412-c06d-1ad7-22204f00d795.png)

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

![スクリーンショット 2024-04-27 23.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/c62915a1-8ccb-8fe8-4f61-cc26d9afc2ef.png)

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

「詳細」を押す

![スクリーンショット 2024-04-27 23.30.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/d152a398-4280-3c92-566a-6edcca99d93f.png)

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

![スクリーンショット 2024-04-27 23.322.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/30b51fc4-e0f9-d2a1-8f77-cc014c68b524.png)

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

![スクリーンショット 2024-04-27 23.34.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/ef527bd2-facf-c9d6-9545-82e33135aa34.png)

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

#### 実行結果（GAS）

![スクリーンショット 2024-04-27 23.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/e91ec391-c9b9-3801-2385-7d172f44c3e7.png)

#### 実行結果（Googleスプレッドシート）

![スクリーンショット 2024-04-27 23.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/d009f3ae-dc87-66eb-9649-741e5133216b.png)

#### 実行結果（Gmail）

![スクリーンショット 2024-04-27 23.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/885b9f59-2787-1428-fa5e-26cf26f0f33b.png)

#### GASのトリガーを設定する

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

![スクリーンショット 2024-04-27 23.14.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/a2a552d5-1776-35ae-119d-60918138123c.png)

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

![スクリーンショット 2024-04-27 23.45.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/cc02287d-d704-d484-293d-cf3258b23676.png)

## おわり

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