スプレッドシートからメールを一斉送信しよう！

google formを使って連絡先を収集する際、メールの一斉送信をしたいことがあるかと思います。
でもformにはそんな機能はついていません。
そんな時、spreadsheetsからならメールの送信ができます！
ただ、少し方法が複雑なので簡単にまとめておきます。
## スプレッドシートを作成しよう！
googleformのアンケート結果からシートを作成します。
管理画面の「回答」タブを開きましょう。
画面上部の「スプレッドシートにリンク」をクリックすると、スプレッドシートが自動で作成されます。
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494402/582f34e2-2656-5a5a-14ec-9e340ae8d339.png)

## スプレッドシートに機能を追加しよう！
スプレッドシートを開くと、上のタブに「拡張機能」があるかと思います。
その中から、「Apps Script」を開くとApps Scriptの画面になります。
![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494402/2207ed66-d827-ff3a-824b-131071d65787.png)
## メールを送信するコードの元を書こう！
Apps Scriptが開けたら、実際にコードを書いていきましょう！
ここでは、コードはGoogle Apps Script（GAS）で書く必要があります。
ですが、今回のコンセプトはGASを学習したことがない人やプログラミング自体を学習したことがない人でも一斉送信ができるようにすることです。
~~実際GASはほとんどJavaScriptと同じですが……~~
そのため、まずはコードのテンプレートを記載しておきます。
元から入っていた内容を削除し、以下のコードをコピーペーストしましょう.
```JavaScript
function sendEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var dataRange = sheet.getDataRange();
  var data = dataRange.getValues();
  
  for (var i = 1; i < data.length; i++) {
    var row = data[i];
    var name = row[n];  //①名前の行の読み込み
    var emailAddress = row[n];  //②メールアドレスの行の読み込み
    
    var subject = "タイトル";  //③タイトルの設定
    var message = 
		'本文'  //④本文の設定
    MailApp.sendEmail(emailAddress, subject, message);
  }
}
```
ここで基本のコードは完成しました！

## メールの本文をカスタムしよう！
では、メール本文の書き方について解説します。
以下の内容をそれぞれのスプレッドシートの内容に合わせて設定しましょう。

### 名前とアドレスの読み込み（①, ②）
まずは送信先の名前とメールアドレスを読み込む設定をしましょう。
上記コードの中では以下の部分で読み込みをしています。
```JavaScript
var name = row[n];  //①名前の行の読み込み
var emailAddress = row[n];  //②メールアドレスの行の読み込み
```
それぞれの```row[n]```の```n```に行を指定します。
行の指定は少し特殊です。
A行を0、B行を1、C行を2……というように0から数え始めます。
デフォルトの状態のスプレッドシートではA行にタイムスタンプが入っているので、自分で設定した項目の行を数えれば簡単に設定ができます。
たとえば、先ほどまでの画像のようにB行に名前、C行にスプレッドシートが入っている場合はコードは以下のようになります。
```JavaScript
var name = row[1];
var emailAddress = row[2];
```

### メールのタイトル(③)
タイトルは以下の「タイトル」と書いてある部分に記入してください。
```JavaScript
var subject = "タイトル";  //③タイトルの設定
```
ここでは特殊な記述方法は必要ありませんが、必ずダブルクォーテーション（"）の中に設定してください。 
### 本文の書き方(④)
本文は以下の「本文」と書いてある部分に入力してください。
```JavaScript
var message = 
    '本文'  //④本文の設定
```
本文は少し特殊な書き方になります。
以下にルールを簡単にまとめます。
```
1. 自分で文を入力する場合はシングルクォーテーション（`）の中に記入する
2. 改行について
    改行は「\n」で行う
    シングルクォーテーション内でエンターキーでの改行は出来ない
3. 名前の使用
    読み込んだ名前を使用するときは「name」と入力する
    名前を読み込むときはシングルクォーテーションの外に出す
    また、シングルクォーテーション内の文とは「+」でつなげる
```
これだけでは少し難しいかもしれないので解説をします。
***2. 改行について***
改行はシングルクォーテーション内に「\n」と記入することで行えます。
二回改行したいときは「\n\n」としましょう。
また、この直後に英語を打ち込むと改行ができないのでスペースを空けましょう。
***3. 名前の使用***
名前は「name」と直接記入することで、スプレッドシートからデータを取り出すことが出来ます。
しかし、シングルクォーテーション内では、そのまま「name」と出力されてしまいます。
これは通常の文字列として認識されてしまうためですね。
そのため、シングルクォーテーションの外に出し、シングルクォーテーションとは「+」をつけてつなげましょう。
では、以下に例を示しておきます。
本文
```
[回答者]様

この度はアンケートへのご回答ありがとうございます。
回答内容は当社の方で大切に保管させていただきます。
またの機会がありましたらよろしくお願いいたします。
```
コード
```
var message = 
    name +'様\n\nこの度はアンケートへのご回答ありがとうございます。\n回答内容は当社の方で大切に保管させていただきます。\nまたの機会がありましたらよろしくお願いいたします。'
```

## メールを送ろう！
コードが書けたら保存をしましょう。
その後、画面上部の「実行」を押すと自動でメールが送られます！
画面の下にログが出力されるので、エラーが発生しなければ送信ができています。
![2023-07-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494402/95056e1a-7ffa-2eda-f49a-c28e325a977d.png)
慣れないうちに業務などで使用する場合はテスト用のスプレッドシートを使用して、ミスがないかの確認をした方がいいかもしれませんね。

## もう少し詳しいコードの解説
ここから先はコードを実際に書く方向けの内容です。

```var sheet = SpreadsheetApp.getActiveSheet();```
……スクリプトが現在アクティブなGoogleスプレッドシートを取得します。
拡張機能はスプレッドシートと紐づいているので、アンケート結果のシートが利用できます。

`var dataRange = sheet.getDataRange();`
……取得したスプレッドシートの全データが入っている範囲（データの最初から最後までの範囲）を取得します。

`var data = dataRange.getValues();`
……データ範囲から全データを取得して2次元配列`data`に格納します。

この2次元配列`data`にはスプレッドシート内のすべてのセルの値が含まれます。
ここまではデータの取得と格納が行われ、実際にメールを作成する前準備が行われています。

`for (var i = 1; i < data.length; i++)`
……: 2次元配列`data`の2行目（インデックス1）から最後までをループ処理します。
1行目はヘッダーなのでスキップします。

`var row = data[i];`
……`data`配列から現在の行のデータを取得し、変数`row`に格納します。
この行のデータは配列であり、それぞれの列に対応する値が含まれています。

`MailApp.sendEmail(emailAddress, subject, message);`
……`MailApp.sendEmail()`メソッドを使用して、変数`emailAddress`に格納されているメールアドレスに対して、変数`subject`の件名と変数`message`の本文を含むメールを送信します。