spreadsheetからcalendarに予定を作成する + slackに自動投稿する

spreadsheetに書き込んだ内容をcalendarに自動で追加するGoogle Apps Script(gas)

を参考に, gasで試してみました.

作成

カレンダーIDを取得

  • google calendarを開く
  • 書き込みたいカレンダーのオーバーフローメニューをクリックし, 設定と共有を開く
  • カレンダーの統合カレンダーIDを以下のcode内で使用する

Google Apps Scriptでcodeを書く

  • speadsheetを開く
  • Tools, Script editorでgasの編集画面を開く
  • codeを書いて保存.
    • XXXXXXXXXXXXXXXXXXXXX@group.calendar.google.comは書き込み先のカレンダーID.
      自分のものに書き換える.
function addEventsToCalendar(){
  var sht, i, eventStartDay, eventEndDay, eventname, place, url, added;

  sht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1");
  for(i = 2; i <= sht.getLastRow(); i++){
    added = sht.getRange(i,1).getValue();
    if(added == "登録する"){
      eventStartDay = sht.getRange(i,2).getValue();
      eventEndDay   = sht.getRange(i,3).getValue();
      eventname     = sht.getRange(i,4).getValue();
      place         = sht.getRange(i,5).getValue();
      url           = sht.getRange(i,6).getValue();
      var starttime = sht.getRange(i,7).getValue();
      var endtime   = sht.getRange(i,8).getValue();

      var startDay = Utilities.formatDate(eventStartDay,"JST","yyyy/MM/dd");
      var endDay   = Utilities.formatDate(eventEndDay,"JST","yyyy/MM/dd");

      if(starttime == ""){
        var start = new Date(startDay); 
      }else{
        var HStart = starttime.getHours();
        var MStart = starttime.getMinutes();
        var SStart = starttime.getSeconds();
        var start = new Date(startDay+" "+HStart+":"+MStart+":"+SStart); 
      }

      if(endtime == ""){
        var MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
        var endTemp = new Date(endDay);
        var end = new Date(endTemp.getTime() + MILLIS_PER_DAY);
      }else{
        var HEnd = endtime.getHours();
        var MEnd = endtime.getMinutes();
        var SEnd = endtime.getSeconds();
        var end = new Date(endDay+" "+HEnd+":"+MEnd+":"+SEnd);
      }

      Cal = CalendarApp.getCalendarById("XXXXXXXXXXXXXXXXXXXXX@group.calendar.google.com");
      if(starttime == "" || endtime == ""){
        Cal.createAllDayEvent(eventname,start,end,{location:place,description:url});
      }else{
        Cal.createEvent(eventname,start,end,{location:place,description:url});
      }
      sht.getRange(i,1).setValue("登録完了");
    }
  }
}
スクリーンショット 2018-08-22 19.04.12.png
  • triggerを設定する
    • Time-driven, From spreadshhetなどでtriggerを追加
    • Edit, Currentproject's triggersを選択
スクリーンショット 2018-08-22 19.07.05.png
スクリーンショット 2018-08-22 19.07.20.png

予定を書く

  • speadsheetに戻る
  • A – H列に下記フォーマットで予定を書き込む.
カレンダー登録状況開始日終了日イベントの名前場所URL開始時刻終了時刻
スクリーンショット 2018-08-22 18.47.34.png


(予定内容は例です)

  • カレンダー登録状況
    • 未選択 (何も書き込んでいない際に指定)
    • 登録する (予定についての情報を書き終えて, カレンダーに登録したいと思った際に指定)
    • 登録完了 (書き込まれるとこのように変化)
      の3種類にした.
  • 開始時刻, 終了時刻を指定していない場合は終日の予定として登録される.
  • 右にある登録するボタンは手動用のボタン. デバックの時に便利というだけで作成しなくても良い.
    • 図形を作成して, Assign script...で, function名(addEventsToCalendar)を指定すれば作成できる
スクリーンショット 2018-08-22 19.11.06.png
スクリーンショット 2018-08-22 19.15.20.png

実行

  • Time-drivenで指定していれば, 指定時間間隔で実行されてgoogle calendarに追加される.
  • ボタンを作成していた場合は, ボタンをクリックすれば追加される.
  • カレンダー登録状況登録するにしている行のみ, 実行時にカレンダーに追加される(codeでそう設定しているだけ)

references

追記: slackにも書き込む (2018/09/15)

下記のようにgasを書き換えればslackにも自動投稿できるようになります

function addEventsToCalender(){
  var sht, i, eventStartDay, eventEndDay, eventname, place, url, added;

  sht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1");
  for(i = 2; i <= sht.getLastRow(); i++){
    added = sht.getRange(i,1).getValue();
    if(added == "登録する"){
      eventStartDay = sht.getRange(i,2).getValue();
      eventEndDay   = sht.getRange(i,3).getValue();
      eventname     = sht.getRange(i,4).getValue();
      place         = sht.getRange(i,5).getValue();
      url           = sht.getRange(i,6).getValue();
      var starttime = sht.getRange(i,7).getValue();
      var endtime   = sht.getRange(i,8).getValue();

      var startDay = Utilities.formatDate(eventStartDay,"JST","yyyy/MM/dd");
      var endDay   = Utilities.formatDate(eventEndDay,"JST","yyyy/MM/dd");

      if(starttime == ""){
        var start = new Date(startDay); 
      }else{
        var HStart = starttime.getHours();
        var MStart = starttime.getMinutes();
        var SStart = starttime.getSeconds();
        var start = new Date(startDay+" "+HStart+":"+MStart+":"+SStart); 
      }

      if(endtime == ""){
        var MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
        var endTemp = new Date(endDay);
        var end = new Date(endTemp.getTime() + MILLIS_PER_DAY);
      }else{
        var HEnd = endtime.getHours();
        var MEnd = endtime.getMinutes();
        var SEnd = endtime.getSeconds();
        var end = new Date(endDay+" "+HEnd+":"+MEnd+":"+SEnd);
      }

      Cal = CalendarApp.getCalendarById("XXXXXXXXXXXXXXXXXXXXXXX@group.calendar.google.com");
      if(starttime == "" || endtime == ""){
        Cal.createAllDayEvent(eventname,start,end,{location:place,description:url});
      }else{
        Cal.createEvent(eventname,start,end,{location:place,description:url});
      }

      postSlack("*" + startDay + " - " + endDay + "* \\n" + eventname + " @ " + place + "\\n" + url);

      sht.getRange(i,1).setValue("登録完了");
    }
  }
}


// slackにメッセージを送る
function postSlack(text){
  var url = "https://hooks.slack.com/services/XXXXXXX/XXXXXXX/XXXXXXXXXXXXXXXXXXX";
  var options = {
    "method"  : "POST",
    "headers" : {"Content-type":"application/json"},
    "payload" : '{"text":"' + text + '"}'
  };
  UrlFetchApp.fetch(url, options);
}

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です