Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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);
}
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away