見出し画像

今日の予定と今週の予定を毎日ラインに一覧で通知したいGAS CalendarAPI LineNotify

最近忙しくて予定の管理が結構大変になってきました
ぜひ皆さんもご活用ください


カレンダーからデータを取得してGASでスプレッドシートに吐き出す

コードで書くとこんな感じ
一週間分のデータを取得してスプシに追加する
最初に初期化を挟むから重複データは出ない

function getSchedule() {
  let sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート名')
  //毎回シートを初期化
  sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()).clearContent();
  //カレンダーID=メールアドレス
  const myCalendar = CalendarApp.getCalendarById('カレンダーID');
  Logger.log(myCalendar.getName());
  let startDate = new Date();
  Logger.log(startDate);
  //一週間後
  let endDate = new Date(startDate.getTime() + (7 * 24 * 60 * 60 * 1000));;
  let events = myCalendar.getEvents(startDate, endDate);
  let eventNum = events.length;

  for (let i = 0; i < eventNum; i++) {
    let arr = []
    let title = events[i].getTitle();
    let startTime = events[i].getStartTime();
    let endTime = events[i].getEndTime();
    let description = events[i].getDescription();
    let location = events[i].getLocation();
    //配列に保存
    arr.push(title,startTime,endTime,description,location);
    //一番下の行にデータを追加
    sheet.appendRow(arr);
    // ちゃんと動作しているか確認するコード
    Logger.log(`Title: ${title}`);
    Logger.log(`Start time: ${startTime}`);
    Logger.log(`End time: ${endTime}`);
    Logger.log(`Description: ${description}`);
    Logger.log(`Location: ${location}`);
    Logger.log('---');
  }
}

スプレッドシートで別タブを作り今日の予定だけ取得

めんどかったらfilterとかでやってもいいかも

=QUERY('シート名'!A1:F, "select * where B CONTAINS date'"&TEXT(TODAY(),"yyyy-mm-dd")&"'")

LineNotifyを使って通知を送信

コードはこんな感じ
とりあえずスケジュール名/開始時刻/終了時刻だけとってきた

function remindSchedule() {
let activeSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
let sheet1 = activeSpreadSheet.getSheetByName('シート名1');
let sheet2= activeSpreadSheet.getSheetByName('シート名2')

const token = 'トークン';

const lineNotifyApi = 'https://notify-api.line.me/api/notify';

let scheduleList1 = "";
let lastRow1 = sheet1.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRowIndex();
let value = sheet1.getRange(1,1).getValue();
if (value ==='#N/A'){
  scheduleList='今日の予定はありません'
}else {
for (let i=1; i<=lastRow1; i++) {
  if (sheet1.getRange(i,1).getValue()===""){
    break
  }else{
    scheduleList1 = scheduleList1 + "\n" + sheet1.getRange(i,1).getValue() +Utilities.formatDate(sheet1.getRange(i,2).getValue(), 'JST','MM/dd HH:mm') +'~'+Utilities.formatDate(sheet1.getRange(i,3).getValue(), 'JST','HH:mm');
  }
};

let scheduleList2 = "";
let lastRow2 = sheet2.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRowIndex();
let value = sheet2.getRange(1,1).getValue();
if (value ==='#N/A'){
  scheduleList='今週の予定はありません'
}else {
for (let i=1; i<=lastRow2; i++) {
  if (sheet2.getRange(i,1).getValue()===""){
    break
  }else{
    scheduleList2 = scheduleList2 + "\n" + sheet2.getRange(i,1).getValue() +Utilities.formatDate(sheet2.getRange(i,2).getValue(), 'JST','MM/dd HH:mm') +'~'+Utilities.formatDate(sheet2.getRange(i,3).getValue(), 'JST','HH:mm');
  }
};
let message= '\n今週の予定は\n'+scheduleList1+'\n\n今週の予定は\n'+scheduleList2;
if(scheduleList2!='今週の予定はありません'){
const options =
  {
    "method"  : "post",
    "payload" : {"message": message},
    "headers" : {"Authorization":"Bearer " + token}
  };


   UrlFetchApp.fetch(lineNotifyApi, options);
}
}

}
}

トリガーを設定

どっちも毎日でOK
カレンダーの取得の方を先に設定しないと古い情報が出てしまう
朝とかにその日のスケジュールまとめてみれると便利かも

シンプルな機能だけまとめたのでうまいこと加工してつかってください!


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