見出し画像

【GAS活用システム⑨】複数LINEグループへの通知とメールを同時送信する

Google Apps Script (GAS)を、もっと身近に、日々の暮らしに。

近頃のサークルやボランティアなどのグループ内の連絡は、LINEグループへのLINE通知で行うことが多いのではないかと思います。

でも、所属するグループの状況によっては、複数のLINEグループに全く同じ内容でLINE通知をする必要があったり、一部の人にはメールで送る必要があったりするかもしれません。

そのような場合、グループAとグループBの送信時間にタイムラグが出てしまった、添付するつもりの画像を送付し忘れてしまった、、、そんな経験はないでしょうか。

大人数への連絡作業は、意外に神経を使うし、結構手間がかかりますよね。

ということで、今回は「送信」ボタンを一回クリックするだけで、LINEとメールに、同時に同じ内容をバーンと送信する、GAS活用システムをご紹介していきたいと思います。

Googleアカウントがあれば、無料で、ご自身でこの仕組みを設定できますよ。

※注意事項※
GASでメールを送信する場合、無料アカウントでは1日あたり100通までという制限があります。
このGAS活用システムでは、「LINEグループへの通知が主で、補助的にメールを使用する」ことを想定し、メールの送信数が無料アカウントの制限範囲内に収まることを前提にしています。

全体像

はじめに「LINE通知とメールを同時送信」する、GAS活用システムの全体像からみていきましょう。

なお、基本的に、「LINEとメールで同じ情報を送付する」ことをコンセプトにします。

送信データや送信先はフォームから入力・指定する

まず、送信する文面や送信先は、フォームから入力・指定するようにします。また、メッセージ(文字)だけでなく、画像ファイルも1つ指定できるようにしたいと思います。

フォームから入力・指定するのは、以下の4つの情報とします。

  • タイトル

  • 送信対象(グループごとに、送信する、送信しないを選択する)

  • 送信文

  • 画像(オプション。メッセージと同時に画像ファイルを送付可。フォームのファイルのアップロード機能を使用 )

LINE Notifyの制約で、画像ファイルはjpg または pngに限定されます。あまりサイズが大きいとメールの制限に引っかかることもあるので、1Mバイトまでという制限を加えていきます(この制限はフォームで設定可能)。

なお、LINE Notifyからは画像ファイル以外は送れないため、その他のファイルを送付したい時は、Googleドライブなどにファイルを置いて、共有したリンクを送信文に埋め込む形で対応してください。

フォームをスプレッドシートにリンクしておけば履歴が一覧で確認可

フォームをスプレッドシートにリンクしておくと履歴が保存されます。

送信後に「送信対象をちゃんと設定したかな。。」など、ちょっと心配になった時に、履歴を確認できます。次に同じような文面で送る時の参考にもなりますよね。

フォーム側の回答タブにも履歴は残りますが、一覧で見れて、かつ、設定が簡単なので、スプレッドシートにリンクすることにします。

LINEグループの送付先トークンとメールアドレスはスプレッドシートに保持

LINEグループの送付先のトークンと、メールアドレスはスプレッドシートに設定することにしました。

フォームにリンクしたスプレッドシート内の、「送信先リスト」シートに送信情報(トークンとメールアドレス)を登録しておきます。

LINEグループの送付先のトークンは、一度取得したら変更することはあまりないと思いますが、メールアドレスはメンテナンスが必要ですよね。

「送信先リスト」シートにすべてまとめておき、変更があればこのシートを編集するようにします。

GASはフォーム側で設定

実際にLINEやメールを送付するのは、Google Apps Script (GAS)です。今回はフォーム側にGASを記述していきたいと思います。

GASは、フォーム側でもスプレッドシート側でもどちらにも記述できますが、今回、スプレッドシートには履歴の書き込むという作業があるので、作業分担ということで、LINEやメールの送付のGASはフォーム側に分担させることにしました。

設定編

それでは、実際に設定をしていきましょう。まずはフォームからです。

フォームの設定

Google ドライブへアクセスし、Googleフォームを保存するフォルダに移動してから、左上の「新規」をクリックします。

Googleフォーム > 空白のフォーム を選択します。

無題のフォームが作成されました。

フォームのタイトル、右上のフォームの名前を変更します。

1つ目の質問として「無題の質問」が「ラジオボタン」の回答形式で自動生成されています。

これを以下のように変更します。

  • タイトル(回答形式は「記述式」。必須。)

この「タイトル」は「必須」にします。

「質問を追加」をクリックすることで、項目が追加できます。

以下の残り3つの項目を追加します。

  • 送信対象(回答形式は「選択式(グリッド)」。各行で1つの回答を必須にする)

  • 送信文(回答形式は「段落」。必須)

  • 画像(回答形式は「ファイルのアップロード」)

2つ目の質問名を「送信対象」、回答形式を「選択式(グリッド)」にすると、「行」と「列」が表示されます。

行に、「LINE・グループA」「メール・グループC」といった、送信手段と対象グループ名を設定します。「LINE・グループA」は、"グループAに、LINEで通知する"という意味になります(※間に「・」をつけてください)。
数に制限はないので、必要に応じて、定義してください。グループ名はLINEとメールで重複してもOKです。悩んだら、いったん、ここでは仮の名前でも大丈夫です。
また、列には、「送信する」、「送信しない」の2つだけ設定します。
最後の、「各行で1つの回答を必須にする」は選択しておきましょう。

ここまで設定したら、いったん、プレビューボタンで、「選択式(グリッド)」の質問形式がどのようになるのか確認しておきます。

以下のように、送信対象のそれぞれのグループに対して、送信する、送信しない、のどちらかを選択するようになっていればOKです。

フォームの設定画面に戻りましょう。続けて3番目です。質問名は、「送信文」、回答形式は「段落」とし、必須に設定します。

そして、最後の4番目として、質問名を「画像」、回答形式として「ファイルのアップロード」を選択すると

以下のようなメッセージが表示されますので、確認して「次へ進む」を選択します。

次に表示される詳細設定で、以下の設定を行います。

  • 特定のファイル形式のみ許可を選択し、「画像」のみチェック

  • 最大ファイルサイズを1MBに変更(LINE通知やメール送信にはデフォルトの10MBは少々大きすぎるため)

  • その他のオプション(質問の右下《︙》)> 説明 を選択。

説明として、”メッセージと同時に 1MB以下の画像を1つ送付できます (jpg, pngファイルのみ)”と入力します。

以上で4つの質問の設定が完了しました。

続けて、設定タブをクリックして、「メールアドレスを収集する」で「確認済み」を選択します。

この設定により、フォームからデータを入力する際に、チェックするだけでメールアドレスが記録されるようになります。

このメールアドレスはスプレッドシートの送信履歴に記録されます。これにより、フォームから複数人が入力する場合、最終的に誰が送信したのか、判別することが可能になります。

なお、メールアドレスの記録が不要な場合は、この「メールアドレスを収集する」の設定はしないでも大丈夫です。どちらでも、後で定義するGASのコードには影響しません。

さて、フォームでのほぼ最後の設定として、デザインの変更をします。一番上の「テーマのカスタマイズ」を選択して

好みのヘッダーの画像や背景の色などに変更してみましょう。

スプレッドシートにリンク

続けて、作成したフォームを新規スプレッドシートにリンクしていきます。「回答」タブの「スプレッドシートにリンク」をクリックします。

新しいスプレッドシートを作成を選択して、作成をクリックします。

フォームに紐づいた新規スプレッドシートが作成されました。

お好みで、シート名を変更したり、メニューの 表示形式 > 交互の背景色 で交互の背景色を定義したりしてみましょう。

「送信先リスト」シートの作成

続けて、送信情報(トークンとメールアドレス)の設定をします。

フォームに紐づいたスプレッドシートで、「シートを追加」して、新しいシート名を「送信先リスト」に変更します。

「送信先リスト」シートの1行目に、以下の4つの見出しをつけます。

  • A列は「区分」

  • B列は「グループ名」

  • C列は「トークンまたはメールアドレス」

  • D列は「備考」

A列「区分」には、"LINE"、もしくは "メール"の文字を入力します。GASで、A列「区分」に"LINE"と入力されていればLINEで通知し、 "メール"と入力されていればメールで送付します。

B列「グループ名」には、わかりやすいグループ名を入力してください。LINEグループの名称と必ずしも一致する必要はありません。人が見て判別しやすいグループ名にします。

ここで、注意事項です。B列のグループ名は、フォームの送信対象の行で定義した、「・」の後と完全に同じ名称にしてください

フォームの送信対象で"送信する"にしたグループ名の送信情報を、GASはこの「送信先リスト」シートから取得します。半角や全角、大文字・小文字も区別します。グループ名は完全に一致させましょう。

もし、「送信先リスト」シートのグループ名を変更する場合は、フォームの送信対象の「・」の後のグループ名もあわせて変更する必要があります。ご注意ください。

続けてC列の「トークンまたはメールアドレス」です。A列の値が"LINE"の場合はそのグループのトークンを取得してC列に設定しておきます。トークンは、GASで通知を送る際に、送付先のLINEグループを特定する、43文字程度と結構長めの英数字です。

トークンの取得の方法は、以下の記事で画面ショットつきで紹介しています。

LINEグループのトークンの他に、テスト用に自分自身にだけ通知するトークンを取得しておくといいでしょう。

LINEグループのトークンの取得ですが、もし、あなたがLINE通知の送付対象のLINEグループに所属していないとしたら、方法は2つです。

1つ目は、LINEグループに所属している人にトークンを取得してもらうこと。2つ目は、対象のLINEグループに招待してもらい、LINEグループに所属後、トークンを取得することです(ちなみに、以前試してみましたが、トークン取得後、そのグループから退会してもそのトークンは有効でした)。

また、LINE NofityからLINEグループへ通知を送るためには、あらかじめ対象のLINEグループにLINE Nofityを招待しておく必要があります。ただ、招待するだけですが、この手順についても【GAS活用術①-6】で画面ショットつきで説明しています。

もちろん、A列の値が"メール"の場合は、C列の値はメールアドレスとなります。対象グループに、複数のメールアドレスを登録する場合は、以下のように同じグループ名で行を複数定義してください。

A列の「区分」がLINEの場合は、1つのグループ名につきトークンは1つなので、1行になります。
A列の「区分」がメールの場合は、1つのグループ名でメールアドレスの数だけ、行を複数、定義することになります。

なお、GASで参照するのは、A~C列の値のみです。D列の備考は、GASで参照しないため、特にルールはありません。好きな情報を登録してください。

まずは自分自身のトークンやメールアドレスを設定しておいて、テストをしてみることをお勧めします。

以上で「送信先リスト」シートの設定が終了です。

フォーム側のGASの設定

続けていよいよGASの設定です。

先に説明した通り、今回はフォーム側での設定となります。フォームの作成画面に戻り、画面の右上、送信ボタンの右隣の点3つをクリックして、スクリプトエディタを選択します。

スクリプトエディタが起動されます。

下記のスクリプトをコピーします。

function notifyAtOnce(e){

  //フォームとリンクしているスプレッドシートの"送信先リスト"の表データを取得
  const ss = SpreadsheetApp.openById(FormApp.getActiveForm().getDestinationId());
  const sh = ss.getSheetByName("送信先リスト");
  const list = sh.getDataRange().getDisplayValues().slice(1);   //ヘッダー行を除く
  
  // フォームの送信内容を取得し、回答を分割代入して各変数に取り出す
  const items = e.response.getItemResponses();
  const [title, sendYesNo, msg, fileID] = items.map(item => item.getResponse());

  //送信対象は二次元配列で取得する。まずグリッドの行のラベルを取得する
  const gridRows = items[1].getItem().asGridItem().getRows();
  //グリッドの行のラベルを"・"の前と後で分割、さらに回答をつけて二次元配列にする
  const sendTargets = gridRows.map((value, idx) => {
    return [value.split("・")[0], value.split("・")[1], sendYesNo[idx]];
  });

  //画像が指定されている場合はIDからファイルを取得し、参照権限を付与し、blobにする
  if (items[3] != undefined) { 
    const fileImage = DriveApp.getFileById(fileID);
    fileImage.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW);
    var blob = fileImage.getBlob();
  }        

  sendTargets.forEach(([category, group, yesNo]) => {
    if (yesNo == '送信する'){ 
      if (category == 'LINE'){        
        //「A列の値が'LINE'でB列の値が対象グループと同じもの」の条件にlistから一致する行を探す
        const index = list.findIndex(lineG => (lineG[0] == category) && (lineG[1] == group));
        const token = list[index][2];
        const line_msg = '\n**' + title + '**\n\n' + msg;
        const options = {
          "method": "post",
          "Content-Type" : "application/x-www-form-urlencoded",
          "payload": {"message": line_msg,"imageFile" : blob},
          "headers":{"Authorization" : "Bearer " + token}
        };
        UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
      }else if  (category == 'メール'){
        //「A列の値が'メール'でB列の値が対象グループと同じもの」を条件にlistにフィルターをかける
        const emails = list.filter(mail => (mail[0] == category) && (mail[1] == group));
        const addresses = emails.map(email => email[2]);
        const options = {attachments :blob};
        GmailApp.sendEmail(addresses, title, msg, options);
      }
    }
  }) 
}

まぁまぁ長いですが、どうにか50行以内に収まりました。。

スクリプトエディタに戻って、初めから記載されている「function myFunction ( ) { }」の部分を消して、上記のコードをペーストします。

基本的に、変更箇所はありません。もし、LINEの通知での「☆☆タイトル☆☆」の、☆を他の記号に変更したい場合などは、この段階で該当箇所を変更してください。

「無題のプロジェクト」をクリックして、プロジェクト名に変更したら、ツールバーの保存アイコンで保存します。

スクリプトエディタのツールバーに、NotifyAtOnce関数が表示されていることを確認したら、実行ボタンをクリックします。

「承認が必要です」と言われます。

新規プロジェクトを実行する時に必要な「実行権限の承認」ですね。以下の手順でパパッと承認しちゃいましょう。
→ 「権限を確認」をクリック
→ Googleにログイン画面で、自分のアカウントを選択
→ 「詳細」、「[プロジェクト名](安全ではないページ)に移動」を順番にクリック
→ 「許可」をクリックすることで、実行権限の承認完了

実行権限を承認後、スクリプトエディタに以下のような実行ログが出てくると思います。

エラーと表示されますが、この実行ログが出てきて正解です。

この辺の話は【GAS活用術④-1】で説明していますので、よかったらご参照ください。

フォーム送信時のトリガーを設定する

最後に、登録したNotifyAtOnce関数がフォーム送信の度に自動的に実行されるように、トリガーを設定していきます。スクリプトエディタの画面左端のメニューバーで「トリガー」を選択します。

「トリガーを追加」をクリックします。

トリガーを追加の画面で、「実行する関数の選択」でNotifyAtOnce、「イベントのソースを選択」でフォームから、になっていることを確認し、「イベントの種類を選択」のプルダウンをクリックして、フォーム送信時を選択します。保存ボタンをクリックします。

フォーム送信時のトリガーの設定できました。

動作確認

この時点で、いったん動作確認を行いましょう。フォームの作成画面で送信ボタンをクリックします。

送信方法で「リンク」を選択します。「URLを短縮」のチェックはお好みで。URLをコピーします。

せっかくなので、URLにスマホからアクセスしてみましょう。

今回はファイルのアップロード機能を使っているので、Googleアカウントにログインをする必要があります。

また、フォームの設定で「メールアドレスを収集する」で「確認済み」を選択した場合は、一番始めに「メールアドレスを記録する」が出てきます。チェックしておきましょう。

続けて、タイトルを入力して、送信対象を選択します。

送信文を入力して、初回は画像の指定はせず、送信します。

LINE NotifyからLINE通知が届きました!

同時刻にメールも送られてきています。

続けて、ファイルを添付したものも送ってみます。画像で「ファイルを追加」ボタンをクリックします。

写真ライブラリから選択してアップロードしたり、マイドライブから選択するなど、いろいろな形で画像が選択できます。

画像を選択後、送信します。

グループAもグループBも、わかりやすいようにトークン名を変えて、テスト用に自分自身へ送付しています。二通、同時刻に送られてきています。

メールでもファイルが添付されて送付されています。

送付が正しく行われない場合は、手順を見直してください。

特に、フォームの送信対象のグループ名と、スプレッドシートの「送信先リスト」シートのグループ名が完全に一致しているか、確認してみましょう。

送信履歴の確認とおまけのGAS設定

最後に、スプレッドシートの送信履歴が正しくとれているか確認しておきます。きちんと履歴がとれていますね。画像は所定のフォルダに保存され、リンクで確認することもできます。

ちなみに、フォームからスプレッドシートにリンクした場合、最新のデータは最終行に保存されます。

履歴が増えてくると、最新のデータが一番下に表示されるのは、意外に不便です。

履歴データを、新しい順に表示したくなったら、以下の記事を参考に、スプレッドシートのデータをタイムスタンプの新しい順(降順)にソート(並べ替え)するように設定しましょう。

今回は、基本的なGASはフォーム側に設定しましたが、この場合は、スプレッドシート側にGASを設定することで対応します。

A列のタイムスタンプを降順にソートするコードは以下の通りです。

function sortByTimeStamp() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; //一番左のシートを取得
  let range = sheet.getDataRange();
  let dRange = range.offset(1, 0, range.getNumRows() - 1); //見出し行を除く

  // sort({ソートをかける列の指定}, {true: 昇順, false: 降順})
  dRange.sort([{column: 1, ascending: false} //第1キー:A列(タイムスタンプ), 降順
              ])
}

短くて簡単なので、よかったらこちらも設定してみてください。

これですべての設定が終了しました。

テストを何度か実施し、うまくいったら、「送信先リスト」シートを実際に送付したいLINEグループのトークンやメールアドレスに変更して、本番の、LINEとメールの同時送信を実行してみてください!

おわりに

複数LINEグループへの通知とメールを同時送信する、GAS活用システム、いかがだったでしょうか。この仕組み、ありそうで、意外にないようです。

今回、送信対象や送信データはフォームから入力するようにしましたが、その利点としては、以下の通りです。

  • フォームで一件ずつ送信するので、間違いが少ない。

  • 送信対象は、グループごとに「送信する」か「送信しないか」選択だけで済む。

  • パソコンからだけでなく、スマホからも送信が可能。

  • ファイルのアップロード機能を活用することで、画像の指定が簡単にでいる(サイズを1MBに制限するのもアップロード機能で可能)。

  • スプレッドシートにリンクしておけば、自動的に送信履歴が簡単にとれる。

フォームの定義やGASの設定は少々面倒ですが、一度定義してしまえば、あとはフォームから送信データを指定・入力して「送信」するだけで、複数LINEグループへの通知とメールが同時に送信されます。

LINEグループの追加・削除やメールアドレスの変更などがあっても、GASは変更しないでもいいようになっています。

送信するメール数が無料アカウントの制限内に収まるのであれば、仕組み自体も無料で設定可能なので、グループ内の連絡に手間がかかっている方は、ぜひお試しください。

この記事が気に入ったらサポートをしてみませんか?