0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Gas】GoogleHomeで有料版Gsuiteのカレンダーを読み上げるごり押し方法

Last updated at Posted at 2019-01-08

#経緯
download.jpg

会社の上司がGoogleHomeMiniを購入したが自分のカレンダーの予定が読み上げてくれないんだけど!!!設定に来てくれない??と呼び出されました。
設定画面を見ても全然カレンダーが出てこないので色々と検索してみた結果・・・

https://webnetforce.net/g-suite/
どうやら有料版のGsuiteの予定は読み上げてくれないらしい。

2017年11月27日の情報なのでもしかしたら今は読み上げてくれるかもしれない・・・。

#じゃあどうしたの?
gasに頼って読み込むことのできるカレンダーに全部コピーしちゃえばいいんじゃね?
企業用の有料アカウントのスケジュールを無料のGmailアカウントのカレンダーにコピーするだけ!!!!
これで読み上げてくれるはずだよね!!!
なので無料のGmailアドレスが必要になってくるのでご注意ください。
ただスケジュールを完全に持ってきてしまうので、コピペ専用のアカウントがあると混ざらなくて済むかもしれない?

#コードとかスプレッドシートの中身
こんなスプレッドシートを用意します。
キャプチャ.PNG
取得開始日と取得する月数を設定できるようにしてみました。
あまりにもカレンダーが多い人は取得月数を少なくしないとGasの実行制限(6分?)に引っかかって途中で死ぬかもしれないので調整してください。

function Getcalendar(){
  var getsheet = SpreadsheetApp.getActiveSheet();
  var getcal = CalendarApp.getCalendarById("コピー元のGmailアドレス");

  var writecal = CalendarApp.getCalendarById("コピー先のGmailアドレス");
  if(getsheet.getRange("D2").getValue() !== ""){
    DeleteEvent(getsheet,writecal);
  }
  var nowdate = new Date(getsheet.getRange("G1").getValue());
  var afterdate = new Date(nowdate);
  afterdate.setMonth(afterdate.getMonth()+getsheet.getRange("G2").getValue());
  afterdate.setDate(afterdate.getDate() + 1);
  
  var myevent = getcal.getEvents(nowdate,afterdate);
  var myeventcontents = [[]];
  var cnt = 0;
  for(var i = 0; i <myevent.length;i++){
    myeventcontents[0][0] = myevent[i].getTitle();
    myeventcontents[0][1] = myevent[i].getStartTime();
    myeventcontents[0][2] = myevent[i].getEndTime();
    var setevents = writecal.createEvent(myeventcontents[0][0],myeventcontents[0][1],myeventcontents[0][2]);
    myeventcontents[0][3] = setevents.getId();
    getsheet.getRange("A" + (i+2) + ":D" + (i+2) ).setValues(myeventcontents); 
  }
}

function DeleteEvent(getsheet,delcal){
  var delevents = [[]];
  Logger.log(delcal);
  delevents = getsheet.getRange("D2:D" + getsheet.getLastRow()).getValues();
  for(i=0;i<delevents.length;i++){
    var delid = delcal.getEventById(delevents[i]).deleteEvent();
  }
  getsheet.getRange("D2:D" + getsheet.getLastRow()).clear();
}

#つかいかた
1.有料版のほうのGmailアドレスで新規のスプレッドシートの作成
2.スプレッドシートのG1に取得開始日を入力
3.G2に何か月取得するか数字を入力
4.スプレッドシートからスクリプトエディタを開いて上記のスクリプトをコピペ
5.アドレスの入力する。
6.スクリプトのトリガーを毎晩走るように設定する。

#注意点
当方GoogleHomeを所持していないのでどんな風にスケジュールを読み上げるのか知りません。
そのため日時とタイトルしか取得しないようにしています。
もしタイトルすらこぴってくるのが企業のコンプラ的にNGであればgetTitle()の所を以下のように書き換えてもらえればタイトルがすべて予定ありに書き換わります。
myeventcontents[0][0] = "予定あり";
くどいようですが、当方GoogleHomeを所持していないのでどんな風に読み上げられるか、連携されるのかがわかっていないので使用に関しては完全に自己責任でお願い致します。
どんな被害を被っても私は責任はとりません。
あと細かいバグがあるかもしれないのでなんかバグったら教えてください。頑張ってつぶします。

#最後に
記事を調べていたらどうにもGoogleHomeだと読み上げられないけどアレクサとかなら有料版の物でも読み上げてくれるとかなんとか。
あれ?アレクサ買えば解決じゃ・・・・・・・・・・

あとコードについても自分の知識をフル稼働して作っていますが、無駄がかなり多いと思いますので添削大歓迎です。
むしろお願いします。

あと、こいつを持っていったらそこまでするぐらいならいいやと言われて無駄になったマクロちゃんです。
誰か供養してやってください。

つたない文章でしたがありがとうございました。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?