LoginSignup
23
32

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-22

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

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

作成

カレンダーIDを取得

  • google calendarを開く
  • 書き込みたいカレンダーのオーバーフローメニューをクリックし, 設定と共有を開く
    スクリーンショット 2018-08-22 19.20.21.png

  • カレンダーの統合カレンダーIDを以下のcode内で使用する
    スクリーンショット 2018-08-22 19.20.41.png

Google Apps Scriptでcodeを書く

  • speadsheetを開く
  • Tools, Script editorでgasの編集画面を開く
    スクリーンショット 2018-08-22 18.59.48.png

  • codeを書いて保存.

    • XXXXXXXXXXXXXXXXXXXXX@group.calendar.google.comは書き込み先のカレンダーID. 自分のものに書き換える.
addEventsToCalendar.js
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にも自動投稿できるようになります

addEventsToCalendar.js
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);
}
23
32
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
32