自習用」カテゴリーアーカイブ

GoogleフォームとGASでつくる同報メール送信システム

特定のグループのメンバー全員に連絡をしたいことがあったときに、いちいち名簿を見て誰がメンバーだったかを確認するのは面倒です。さらに、複数のグループや個人が入り乱れて使用する部屋の使用者全員に連絡したいときは、より面倒が増します。そこで、Googleフォームから宛先のグループを選択すれば名簿からメールアドレスを取得して、該当者にメールを送ってくれるシステムをつくってみました。

仕事の効率化のためにプログラミングを勉強しはじめたというレベルなので、動けばよいくらいの適当なコードです。

類似のかんたんリマインダーも参照してください。

Googleフォームでの準備

以下のようなフォームを作成する。送信者のメールアドレス、宛先、メールのタイトル、メールの本文という順番を前提として後述のプログラムを作成した。

Googleスプレッドシートでの準備

フォームの回答が保存されるスプレッドシートを用意する。フォームの編集画面から、「回答」タブを開くとスプレッドシートへのリンクが出てくる。

フォームの回答が保存されているスプレッドシートに、グループの名簿(groupシート)と部屋使用者の名簿(roomシート)を作成する。シートの構成は、1行目にグループ名や部屋名、2行目以降にグループ名か個人のメールアドレス。1列目に説明、2列目以降に中身。フォームからの回答が記録されるシートの名前はanswerに変更する。このあたりはコードの対応が取れていればいいのでお好みで。

スプレッドシートのメニューからスクリプトエディタを開き、以下のコードをコピペ。トリガーにフォームの値送信時を設定する。コードの中のスプレッドシートのidを変更する。

function sendmail() {
  var file = SpreadsheetApp.openById("スプレッドシートのid");
  var answer_sheet = file.getSheetByName('answer');
  var group_sheet = file.getSheetByName('group');
  var room_sheet = file.getSheetByName('room');

  //フォームに入力された値を読み取る
  var rowtoread=answer_sheet.getDataRange().getLastRow(); //フォームの回答が記入された行を求める
  var answer = answer_sheet.getRange(rowtoread,2,1,4).getValues(); //フォームの回答を取得

  var sendfrom = answer[0][0];
  var sendto = answer[0][1];
  var title = answer[0][2];
  var message = answer[0][3];

  //グループのアドレスリストを入手する
  var groupnum = group_sheet.getDataRange().getLastColumn()-1; //グループ数を取得
  var grouplist = group_sheet.getRange(1,2,1,groupnum).getValues(); //グループ名のリストを取得

  var group_lastrow = group_sheet.getDataRange().getLastRow();

  //宛先がGroupの場合。宛先リストにメールアドレスを追加する。
  var sendtolist = [];
  appendfromgroup(sendto, sendtolist, group_sheet, groupnum, group_lastrow);

  var roomnum = room_sheet.getDataRange().getLastColumn()-1; //room数を取得
  var roomlist = room_sheet.getRange(1,2,1,roomnum).getValues(); //room名のリストを取得

  var room_lastrow = room_sheet.getDataRange().getLastRow();

  //roomシートのroom構成員を宛先にいれる。
  for(var k = 2; k <= roomnum + 1; k++) {
    if(sendto === room_sheet.getRange(1,k).getValue()) {

      for(var l = 2; l <= room_lastrow; l++) {
        //roomの構成員がgroupの場合
        var temp = room_sheet.getRange(l,k).getValue();
        if (grouplist[0].indexOf(temp) > -1){
        appendfromgroup(temp, sendtolist, group_sheet, groupnum, group_lastrow);
        }
        //roomの構成員がgroupでない場合、メールアドレスが入力されていると判定
        else{
          sendtolist.push(temp);
        }
        }
      }
    }

  //重複をのぞく
  var sendtolist_true = sendtolist.filter(function (x, i, self) {
            return self.indexOf(x) === i;
        });

  //メール本文の修正
  message = "宛先: " + sendto + "\n送信者: " + sendfrom + "\n\n" + message;

  //メール送信
  MailApp.sendEmail(
      sendtolist_true, //toアドレス
      title,  //メールタイトル
      message, //本文
      {
        from: sendfrom, //fromアドレス
        cc: sendfrom, //送信依頼者にccで送る
        name: "同報メール送信フォーム" //差出人
      }
    );
}

function appendfromgroup(sendto, sendtolist, group_sheet, groupnum, group_lastrow){
  //宛先リストに該当するメールアドレスを追加する
  i = 0;
  for(var i = 2; i <= groupnum + 1; i++) {
    if(sendto === group_sheet.getRange(1,i).getValue()) {
      for(var j = 2; j <= group_lastrow; j++) {
        sendtolist.push(group_sheet.getRange(j,i).getValue());
      }
    }
  }
  return sendtolist;
}

フリーの動画変換ソフトffmepgの使い方

仕事で動画を撮っていると、データのファイルサイズが大きすぎて困る。他人に見せるときはファイルサイズが小さい方がいいし、imageJなんかでデータ解析するときには非圧縮の方が都合が良い。動画の変換で良いソフトウェアはないものかと探していると、ffmepegに出会った。

インストールの仕方

windowsにffmpegをインストールする

自分のPCにあったファイルをダウンロード、解凍して適当な場所に置けばOK。マイドキュメントなど。

とりあえず、スタートメニューからコマンドプロンプトを起動する。C:\users\hoghogeのように現在のフォルダのパスが表示されるので、ffmpeg.exeのあるフォルダに移動する。コマンドプロンプトでフォルダを移動する場合はcd hogehogeとする。ちなみに”\”は”¥”と表示されるけれど気にしない。

例 cd c:\ffmpeg\bin

網羅的な説明

ffmpegの使い方

最新ffmpegのオプションまとめ コマンドの意味を調べる辞書として使える

実施例

windows7でも再生できる動画を作るためのffmpeg / avconv の cheat sheet

動画処理の定番ツール「FFmpeg」ことはじめ

古いWindowsで再生できない

会社の支給PCだと最新のOSを使えるとは限らない。たとえば、標準のWindows7ではH.264のmp4を必ず再生できるわけではない。

また、H.264の動画をPowerPointに埋め込む場合も、PowerPoint2010以降である必要がある。

YUVフォーマットもちゃんと設定してやる。

結局のところなんて打てばいい?

ffmpeg -i example.avi -c:v libx264 -movflags +faststart -vf format=yuv420p example.mp4

仮にtest1フォルダに入っているexample.aviをtest2フォルダに変換したい場合は以下のように書ける。あるいは、C:\からファイルのパスを書いてもいい。

ffmpeg -i test1\example.avi -c:v libx264 -movflags +faststart -vf format=yuv420p test2\example.mp4

これでおそらくWindows 7のエクスプローラでサムネイルが表示され、Media playerで再生できる形式の動画になる。非圧縮に比べて数十分の1のファイルサイズになる。

環境が古くてWMV形式にしたい場合は、wmvでエンコードする(PowerPoint用動画)を参照する。ビットレートのデフォルト設置値が低いので、必ず自分でビットレートを設定する。

AndroidやiOSのスマホ、タブレットで再生したい場合は、とりあえず上の通りのコマンドで再生できるファイルができるはず。

動画をPowerPointに埋め込む

もっと手軽にしたい。batファイルでドラッグアンドドロップ

決まった形式に変換するだけなら、batファイルを作っておくと楽。元動画ファイルをbatファイルにドラッグアンドドロップすれば変換された動画が出力されるようにできる。

[Windows]ffmpegとbatファイルで快適ドラッグ&ドロップ変換が複数ファイルの一斉変換に対応している。
FFmpegの使い方 ドラッグアンドドロップするは単一ファイル処理に絞って短いコマンドで書いていている。

リンク先で紹介されているコマンドのうち、ffmpegの設定に関わるところを自分の好きなように変更する。