かずきち。の日記

サーバサイドエンジニアのつぶやき

Googleサービスを無料で使い続けるスクリプトを書いてみる!自動でGoogleストレージを空けに行くスクリプト

Yahoo!Googleの15GB制限を超えないための3つのステップが紹介される

news.yahoo.co.jp
引用:
https://news.yahoo.co.jp/articles/baf5c1ea64f5aa47bd7c4663c91ebda369fc1313?page=1

どうでもいいですが、これって「人手」ですよね?
そしてファイルの容量のために月額200円を死ぬまで払い続けるか?って言ったらちょっと嫌です。
まーみなさん、なんだかんだGmailを使っていると思いますので、便利なスクリプトを書いてみました。
GoogleストレージというのはGmailGoogleドライブ、Googleフォトなどのサービス全般で使わます。

初期は「Googleって15GBもくれるのか!太っ腹だな」と思うのですが、徐々に容量が減ってきてしまうんです。

f:id:kazukichi_0914:20210905112520g:plain

この写真もあと3GBで終わりますよと通知をしています。
容量が切れるとメールが受信できなかったり、ファイルが保存できなかったり、支障が出ます。
そんなときは自動で受信ボックスを整理するスクリプトを書きましょう!

さくさくっと書いていきます
//トリガーを設置する関数(testget関数を実行予定として登録)
function setTrigger(){
   var triggerman = ScriptApp.newTrigger("deleteOldMail")
                   .timeBased()
                   .everyMinutes(30)
                   .create();
}

function deleteOldMail() {
  //検索条件を指定
  var deleteThreads = GmailApp.search("label:消したいメールの演算子");
  //検索条件に合致するメールをゴミ箱に移動
  for (var i = 0; i < deleteThreads.length; i++) {
    deleteThreads[i].moveToTrash();
  }
 
}


完成です。
めっちゃ短いですが、もうこれであなたはGoogleストレージ不足から開放されます。

やってることはルンバと同じ

f:id:kazukichi_0914:20210905113223g:plain
引用:
babyrenta.com

ルンバって自分でお部屋をお掃除して、自分で充電器に戻るみたいなやつです。
(↑だと思ってます。持っていないんで)

そんなGoogleお掃除ロボを作ってみました!

自動でGmail削除してくれます

実行結果を見てみましょう!

f:id:kazukichi_0914:20210905113726g:plain

毎週1回必ず、自動でGmailの受信トレイをキレイキレイしてくれていました。
実行回数299回*7日なので、 約2100週間Googleが自動で働いてGmailを整理してくれたことになります。
めっちゃシンプルなスクリプトなのでエラー率0%で稼働し続けてくれています。
便利だなと思ったら、いいねとシェアをお願いします♪

コードあり!和暦変換関数をGoogleスプレッドで自作してしまおう!

令和になって和暦対応Google関数を作りたい!

f:id:kazukichi_0914:20210904145832g:plain

自分がよく見るLINEグループで和暦対応のGoogleスプレッドシートがほしいと相談を受ける。
まぁ確かにGoogleアメリカの会社ですし、「令和」とか「平成」とかに対応していないのは事実です。
自分は和暦を使わないので、そんなニーズもあるのだなと。

他人の用意してくれた関数を使うのはどうなのでしょうか?
なのでオリジナル関数を作ってしまいましょう!
もうSUM関数とかMicrosoftGoogleが用意した関数に踊らされるのは終わりです。
関数くらい自分で用意です。

まずは完成形

docs.google.com

上記リンクが和暦計算シートですのでアクセスしてみてください。
単なるスプレッドシートじゃないか?とお思いですが、このスプレッドシートは裏でコードが走っています。

完成体:
騙されたと思ってA1セルに「=WAREKI(2021)」と入力してみましょう。


f:id:kazukichi_0914:20210904150358g:plain

こうですよ?できましたか?

f:id:kazukichi_0914:20210904150505g:plain

そうすると=WAREKI()関数

が発動して、西暦2021年は令和3年と変換ができます。

これは会社で使えそうですね。

function WAREKI(y){ 
  let result = 10;

  if(y >= 1868){
    if(y - 1868 > 1){
      result = `明治${y - 1868}年`;
    }else{
      result = `明治元年`;
    }
  }

  if(y >= 1912){
    if(y - 1912 > 1){
      result = `大正${y - 1912}年`;
    }else{
      result = `大正元年`;
    }
  }

  if(y >= 1926){
    if(y - 1926 > 1){
      result = `昭和${y - 1926}年`;
    }else{
      result = `昭和元年`;
    }
  }

  if(y >= 1989){
    if(y - 1989 > 1){
      result = `平成${y - 1989}年`;
    }else{
      result = `平成元年`;
    }
  }

  if(y >= 2018){
    if(y - 2018 > 1){
      result = `令和${y - 2018}年`;
    }else{
      result = `令和元年`;
    }
  }
  return result;
}

コードは至ってシンプルでこのスクリプトを裏で走らせるだけです。
会社で令和対応したい方はぜひこの関数を埋め込んでみてください。
10秒で令和対応が可能ですよ。

docs.google.com

使ってみたい方はこちらから試し書きをお願いします!
使えるなと思った方はいいねとシェアをお願いします!

f:id:kazukichi_0914:20210904161113g:plain

感謝の声もいただけると大変励みになります♪

追記

昭和1年とか令和1年とかはおかしいというご指摘を受けましたので、元年エラー処理を追記しました!

GASのマニフェストファイルって何?マニフェストファイルの表示でわかることとは?

人と話すときに相手がどこにいるか気にしますか?

f:id:kazukichi_0914:20210829154150j:plain
引用:
https://line-howtouse.net/line_talk_basis.php

昔は「夜中は電話をしてはいけません」みたいな風習がありました。
それは夜中に電話したら迷惑ですからね。
でもそれは暗黙のうちに「相手が日本にいる」って自分が決めつけているだけです。
今はIP電話やLINEが普及して、決して電話先が同じタイムゾーンにいる人とは限りません。
ドメスティックな会社は「15:00〜会議ね」みたいなことがありますが、
人間なら「あ、日本人の上司が言ってることだから、日本時間の15:00~会議なんだな」
とわかります。

プログラミング言語の場合「12:00~」って言われたらわからない

f:id:kazukichi_0914:20210829155151g:plain

Googleカレンダーの場合も表示のタイムゾーン日本標準時に設定することができ、また2つめのタイムゾーンも設定することができます。

f:id:kazukichi_0914:20210829154002g:plain

プログラミング言語も同様でマニフェストファイルでタイムゾーンを「Asia/Tokyo」と宣言する必要があるわけです。
じゃないと日本時間として実行されません。

AmazonEC2のサーバは世界中に点在

f:id:kazukichi_0914:20210829155537g:plain
引用:
https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=1268

例えば、AmazonEC2のサーバは世界中にあって、人が寝ている間などにサーバは空きになるので、稼働にかかる料金が安くなります。
なので日本が動いている時に、ブラジルリージョンのサーバの料金は安くなります。

そうするとコードは日本人が書く・実行はブラジルサーバで走らせるみたいなことが頻繁に発生します。

海外旅行に行った時に現地で時計を合わせるみたいなことしませんか?

f:id:kazukichi_0914:20210829155938g:plain
引用:
https://www.paopao.org/post-3236/

人間は旅行に行って時計をずらして、帰ってきた時にまた時計を戻せばいいんですが
データの場合、そうも行きません。

アメリカに行ったり、ヨーロッパに行ったり、日本に行ったり、データが飛びまくりますので
タイムゾーンの管理が煩雑になるんですね。

なので、このコードはAsia/Tokyo向けに書かれたコードだよということを明示して上げる必要があります。
それと同じことをGASでも明記する必要があるんですね。
Googleもこのユーザが日本向けにスクリプトを書いたのか、アメリカ向けにスクリプトを書いたのかわかりませんからね。
プログラミング言語は日本人が書いても、アメリカ人が書いても同じ記法になります。
タイムゾーンをまたいだ開発をしようと思っている方はこの辺の設定がもろに効いてきますのでぜひ意識的に見てみてください。

スクリプトあり!マイホッテンに入っているブログを完全自動・定期で紹介する!

ホッテンとは?

hatenablog.com
引用:
https://hatenablog.com/

はてなブログには特に優れたブログ記事をトップページで紹介してくれるという機能があります。
ここに紹介されるブログを見ることは社会のトレンドであるし、こんな意見もあるんだと勉強になります。
ただウェブページのネックなところは新聞といったメディアと異なり、数時間前に何が表示されていたかわからないところです。

f:id:kazukichi_0914:20210829140756g:plain
引用:
https://www.asahi.com/articles/photo/AS2021051400134

新聞の切り抜きであれば…
Aさんが読んでいる首都圏版朝日新聞5版
Bさんが読んでいる首都圏版朝日新聞5版

は同じ文面になるはずです。

しかし、インターネット記事はそうは行かないのです。

URLは同じでも表示されているコンテンツが異なるということは大いにある。

一番いい例はAmazonです。
過去に買った商品などによって商品がリコメンドされているはずです。
アクセスしている人によってページに表示される内容は異なります。

なので、私にリコメンドされているはてなのホットエントリーを紹介するプログラムを作ります。

function myFunction() {
 
    var url = "https://hatenablog.com/";
    var html = UrlFetchApp.fetch(url).getContentText();
 
    var parse = Parser.data(html);
 
    var links = parse.from('<a href="').to('"').iterate();
    console.log(links[100]);

    var blog ='';

    for(var i=12;i<=100;i++){
      Logger.log(i);      
      //Logger.log(links[i]);

      if(links[i]!==links[i-1]){
        //Logger.log('前と同じじゃない!');
        //Logger.log(links[i]);
        //Logger.log(links[i].length);
        if(links[i].length<90){
          //Logger.log('よさそう');
          Logger.log(links[i]);
          var blog = blog +'<br>['+ links[i]+':embed:cite]';
        }
        Logger.log(blog);

        date = new Date();
        var mailAddress = "自身のID@blog.hatena.ne.jp";
        var timestamp = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd'+"版発行");

      }    
    }
    MailApp.sendEmail(mailAddress, "[Trend]かずきち。のホットエントリー "+timestamp,'最近読んだブログのうち、良かったブログを紹介していきます<br><br>'+blog);
}

35行のコードで完結します。
このコードを実行しますと…

kazukichi0914.hatenablog.com
引用:
https://kazukichi0914.hatenablog.com/entry/2021/08/29/142013

こんなブログ記事が自動で作成されます。

使用ライブラリは「Parser」です

このプログラムでは.parseを使用して、文字列を分割しています。
機械は頭が悪いので、「今日は晴れです」という文章があった時に

「今日」
「は」
「晴れ」
「です」

と人間のうように賢く文字文末ができないのです。
なので、Parserというライブラリでブログの文字を切っています。

f:id:kazukichi_0914:20210829142524g:plain

2021年現在プロジェクトのバージョンは8まで公開しています。
ちなみにかかるお金は無料ですので、ぜひ使ってみてください。
Googleが標準で提供しているライブラリです。

ついたはてなスター・はてブの数を毎日自動記録します はてなブログの頑張りを記録して、モチベーションに

ぜひ自動化に磨きをかけていきましょう。

のべ21万時間を自動化!5ヶ月でアクセス80倍!アドセンスは自動化して解決しないといけないな

アドセンス収益が伸び悩む

Googleアドセンスはアクセス数別収益の目安が一応公表されています。(非公式)

tanweb.net
引用:
https://tanweb.net/2018/03/30/20354/

何PVでどれくらいの収益が上がるかはいろんなサイトで語られています。
月100万とかは1人の力だと難しくて、何人かで力を合わせないと無理です。

1人YouTuberはすごい

収益を上げるにしても、何人で収益を上げるかは大事。

www.uuum.co.jp

基本的にYouTuberは自身の動画づくりに専念して
経費の精算などの事務方はマネジメント会社にやってもらいます。
多くのYouTuberで税務などわからないだろ?って人も動画を出しているわけです。

f:id:kazukichi_0914:20210825095206g:plain

収益の計算は自動化しないと

アドセンスだと毎日,収益が上がってくるのですが…
いちいちエクセルに転機するのもどうかなー?と思ってます。
ちなみに一般的な会社は平気で
「このエクセルを毎日〜〜時になったらデータを計算してここに移動しておいてね」
とか言ってきます。
言い換えると「たぶん、自動化していいからね?」って言ってるんだと思います。

function myFunction(){   
  //昨日の日の収益を移動
  // 現在アクティブなシートを取得
  var sheet = SpreadsheetApp.openById('*********************************');

  //先日のAdSenseデータの移動
  sheet.getRange("A2:J1000").moveTo(sheet.getRange("A3"));

  // 今日の日付を格納
  var date = new Date();
  Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd'));
  var today = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd')-2;
  sheet.getRange("A2").setValue(today);

  //一週間前を取得
  var date = new Date(); //現在日時のDateオブジェクトを作る
  var today = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd');
  
  //現在の「日」を取得
  var day = date.getDate();
  Logger.log(day); //5
  
  //前日日付にしたいので-1する
  date.setDate(day-7);
  Logger.log(date); //Wed Sep 04 19:33:33 GMT+09:00 2019
  
  //日付の表示形式を整形する
  var lastweek = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd');
  Logger.log(lastweek); //2019/09/04
  
  var adClientId = 'ca-pub-*******************';
  var startDate = lastweek;
  var endDate = today;
  var metrics = ['PAGE_VIEWS', 'CLICKS', 'PAGE_VIEWS_CTR', 'COST_PER_CLICK', 'PAGE_VIEWS_RPM','EARNINGS'];
  var args = {'metric': metrics,
 'dimension': ['WEEK'],
 'filter': ['AD_CLIENT_ID==' + adClientId],
  };

  var report = AdSense.Reports.generate(startDate, endDate, args).getRows();
  Logger.log(report[1]);
  Logger.log(report[1][1]);
  sheet.getRange("A2").setValue(report[1][0]);
  sheet.getRange("B2").setValue(report[1][1]);
  sheet.getRange("C2").setValue(report[1][2]);
  sheet.getRange("D2").setValue(report[1][3]);
  sheet.getRange("E2").setValue(report[1][4]);
  sheet.getRange("F2").setValue(report[1][5]);
  sheet.getRange("G2").setValue(report[1][6]);

  //pv取得
  var pv =sheet.getRange("B2");
  var pv2 = pv.getValue();

  //クリック数取得
  var click =sheet.getRange("C2");
  var click2 = click.getValue();

  //CTR取得
  var ctr =sheet.getRange("D2");
  var ctr2 = ctr.getValue();+"\nCTR:"+ctr2

  //CPC取得
  var cpc =sheet.getRange("E2");
  var cpc2 = ctr.getValue();
  
  //RPM取得
  var rpm =sheet.getRange("F2");
  var rpm2 = ctr.getValue();

  //収益取得
  var earn =sheet.getRange("G2");
  var earn2 = ctr.getValue();

  //総収益
  var all =sheet.getRange("J1");
  var all2 = ctr.getValue();

  var messageText = "\n"+today+"\nPV数:"+pv2+"\nクリック数:"+click2+"\nCPC:"+cpc2+"\nRPM:"+rpm2+"\nEARN:"+earn2+"\n\n総収益"+all2;

  // LINEから取得したトークン
  let token = "***********************************"
  let options = {
   "method" : "post",
   "headers" : {
     "Authorization" : "Bearer "+ token
   },
   "payload" : {
     "message" : messageText
   }
 }

 const FValues = sheet.getRange('A:A').getValues();  //A列の値を全て取得
 var lastrow = FValues.filter(String).length;  //空白の要素を除いた長さを取得

 let url  = "https://notify-api.line.me/api/notify"
 if(sheet.getRange("C"+lastrow).getValue() !== ""){
 UrlFetchApp.fetch(url, options)
 }

  var date = new Date();
  //今日の日付を表示
  Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyyMMdd'));
  Logger.log(date);

  var calender = CalendarApp.getCalendarById("******************@group.calendar.google.com");
  
        const option = {
      description: '収益詳細\n'+messageText+'\nhttps://docs.google.com/spreadsheets/d/e/*************/pubchart?oid=1388776535&format=interactive',
      }
  
    calender.createAllDayEvent(
    "収益:¥"+earn2
  , new Date(date)
  , option
   );

}

なので、さくっと自動記録のスクリプトを書きました。
もし10分の作業を365日40年自動化すると…

10分/1日*365日*40年=21万時間の短縮になります。

スクリプトを使うに当たっての注意事項です

分かる人はこのままスクリプトを使ってもらっていいですが、プログラミングの世界にはどのサービスと連携するか?という機能がありまして…

f:id:kazukichi_0914:20210825101405g:plain

今回はSheetsとAdSenseをオンにしています。
なので使う方はこちらを忘れずに。

使い方わからん

developers.google.com
引用:
https://developers.google.com/apps-script/advanced/adsense

自分で先程のコードを改造してもいいですが、ドキュメントは提供されています。
サンプルコードもあって親切です。
強いていうと英語で書いてあるっていう問題はありますが…

ブログで機械による自動投稿はアフィリエイトに有効だった!2021/7/10からアクセスの質が変わる!

このブログは半マニュアル運営

このブログに投稿されている文章は人間が人手で書いて投稿しているものと…
                機械が自動で書いて・投稿しているものがあります。
その中でのトレンド分析系の記事は自動投稿になっています。

ここで私は一つ疑問がありました。
機械に自動投稿させるってことは記事の品質・アクセスの品質が下がるんじゃないか?

という仮説です。
夏目漱石が書いた記事×1記事
コンピュータが書いた記事*10000記事を比較すると
コンピュータが自動生成した記事にアクセスを集める価値はあるのか?という実験です。
実はそんなことを実験していました。

2021年7月からブログの自動投稿を始めました。

オリンピックで暇すぎて自動投稿のスクリプト書いたんです。
もはや人間がブログをすべて人手で書くという行為を諦めました。
マクドナルドやコンビニで単純作業を機械が行っているようにブログも機械に書いてもらっちゃいましょう。
ということで自動投稿のスクリプトを毎日回していました。
で、気になるのは機械が書いた文章に人は集まるのか?という疑問です。
Analyticsを分析すると

f:id:kazukichi_0914:20210817143047g:plain

2021/7/10を境に確実に流入ユーザ数は増えました。
そんなわけで広告のインプレッション収益も増えるわけです。

f:id:kazukichi_0914:20210817143035g:plain

これらの日刊はてなスターという記事は人間が書いていません。
機械が投稿しています。

kazukichi0914.hatenablog.com

どんなことしてるのか?というと、ブログ記事にスターをつけてくれたユーザをはてなid記法で無理やり呼んでいるという手法を使っています。
はてなスターをつけてくれた人にはちゃんとアクセスでお返ししてあげているので、ブログにスターを付けてくれると自動で被リンクがもらえます。

応用系でランキングを考える。
テレビとかオリコンで〜〜ランキングとかよくやっていますが、スクリプト書けば自動ランキングを毎週出すのとかは楽そうですね。
こんなの作って欲しい!みたいなのあったら実装してみます。
よくあるのがAmazonで期間限定セールになった商品を自動で引っ張ってきて、アフィリエイトリンク付きで自動投稿するようなサイトが増えているなとは思っています。
たぶん同じ手法でしょうね。

プログラミングが小学生の必修化!プログラミングの重要性を解説!プログラミングをするなら、最終形態の「自動化」までしないと意味がない!

f:id:kazukichi_0914:20210820112331g:plain
引用:
https://www.irasutoya.com/2015/10/blog-post_9.html

プログラミングが小学校の必修科目になりました

www.mext.go.jp
引用:
https://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1403162.htm

プログラミングが昨今、注目されています。
でもどうしてプログラミングが大事なの?っていうのが保護者はわかっていないと思います。

www.youtube.com

お金の大学リベラルアーツでもプログラミングが注目されています。

arschool.co.jp
引用:
https://arschool.co.jp/blog/archives/3275

ただ上記のページにもありますが、小学生のプログラミングは社会になぜ役立つのかわからないんです。
だってそうでしょう。

function myFunction() {
  Logger.log('1+1=は?');
  Logger.log(1+1);
}

f:id:kazukichi_0914:20210820112028g:plain

1+1=2が計算できました。
あまりうれしくないわけです。
手で1+1=2計算したほうが早いよねって話です。

でもプログラミングでできることは無限大です

www.embot.jp
引用:
https://www.embot.jp/news/290

プログラミングを教えるときにはプログラミングでどんなことができるか教えることが重要です。

f:id:kazukichi_0914:20210820112630g:plain
引用:
https://www.irasutoya.com/2014/08/blog-post_976.html

子供に「プログラミングは何に役立つの?」と聞かれたら親は答えられるのか?

プログラミングの初歩はくっそつまらないです。
断言できます。

「現実になにか不都合があったら、タイムマシンで過去に戻ればいい」とドラえもんは教えてくれましたが…
ドラえもんは存在しません。

f:id:kazukichi_0914:20210820113149g:plain

プログラミング=時短短縮テクだと思ってください。
一度コードを完成させれば、そのコードは死ぬまで動きます。
コードを書いた人が死んでも動きます。

人工知能を題材にした映画が存在します。
よくある結末が「人工知能が暴走して、世界が破滅する」みたいなバッドストーリーです。
でも人工知能が暴走しないようにプログラミングすれば死ぬまで動き続けます。


引用:
http://majoranayokko.jugem.jp/?eid=899

昔は駅員が改札できっぷを切っていたんですよ?
今思えばありえなくないですか?
誰か頭がいい人がSuicaの自動改札を作ってくれたので、券売機でいちいちきっぷを買わなくても
SuiCaの非接触カードでバシバシ処理しています。

プログラミングができると時給という考え方は消える

時給2,000円のバイト=いい仕事だなみたいに思うかもしれません。
でもプログラミングを学習すれば、パソコンに働いてもらうことができます。

自分の代わりに働いてくれる分身を作成ができます。

プログラミングを学習する時はなんとなーくカリキュラムに沿ってやってると、プログラミングの意味を見失ってしまいます。
どちらかというとプログラミングで何ができるかが大事で、プログラミングはゲームのRPGと同じです。

www.youtube.com

最初はスライムをやっつけまくって経験値を貯めてください(=ここが小学生です)
そして、スキルアップして…

www.youtube.com

ボス戦になります。
コードを勉強し始めはRPGの最初のほうだと思ってください。
子供にプログラミングの意味あるの?って質問が連発しそうですが、なんで学ぶ必要があるか?

日本の労働生産性は最下位という現実

f:id:kazukichi_0914:20210820115554g:plain
引用:
https://president.jp/articles/photo/27576?pn=1

ここを日本は「おもてなし」とかいう言葉で片付けに来ています。

f:id:kazukichi_0914:20210820115756g:plain
引用:
https://www.kk-synergy.co.jp/cat01/207622/

効率が悪い=おもてなし

というマジックワードでごまかしていることに気が付きましょう。
だいたい楽そうにしているとサボっているみたいに批判する上司がいる会社は要注意です。
効率がいい≒楽をしているは同値です。
昔はオーダーメイド>工業生産っていう風潮がありましたが、
工業生産>オーダーメイドだと思うんですよね。

13行でGoogleカレンダーにすでに予定が埋まっているか判定するコードを書く

あらすじ

f:id:kazukichi_0914:20210819151052g:plain

Googleカレンダーって便利ですよね。
みなさんも使っているかと思います。
ただGoogleカレンダーって何がすごいかって言うと、決して人間が予定を書き込む必要がないんです。

「機械」

にカレンダーを書き込んでもらうことができます。
上の画像だと、昭和の日やらみどりの日が重複して登録されていますよね?
人間だと重複判定ができますが、コンピュータはアタマが悪いのですでに予定があるかないか判定ができません。

f:id:kazukichi_0914:20210819151506g:plain

人間の場合、あ、スケジュールかぶってるな、重複してるなって判定ができますが…
自動実行をしているとたまにプログラムが暴走して大変なことが起きます。
Googleの暴走が怖いので重複チャックかけるスクリプトを書きました。

コード
//予定のゲストが予定を変更できるか取得するコード
function sampleCodeForCalendarAppIsAllDayEvent() {
  //var calendar = CalendarApp.getDefaultCalendar();
  const CALENDAR_ID = '**********************************@group.calendar.google.com'; //カレンダーID 
  const calendar = CalendarApp.getCalendarById(CALENDAR_ID);
  var date = new Date(); 
  var events = calendar.getEventsForDay(date);

  for (var i in events) {
    var event = events[i];
    Logger.log(event.isAllDayEvent());
    //Turueの場合予定あり
  }
}

21行で完成です。

短。

Trueの場合予定ありってありますよね?
なので先約があるかどうかの判定をするプログラムです。

さて早速実行

f:id:kazukichi_0914:20210819151506g:plain

すでに予定が入っているので「True」=(すでに先約あるよ)で帰ってくれば大成功です。

f:id:kazukichi_0914:20210819152331g:plain


Trueが帰ってきたので、重複予約は避けることができるわけです。
めでたしめでたしです。

GoogleAppsScriptでサイトの死活管理ツールを作った

サイトがあるかないかをチェックするのはURLにアクセスすればよい

f:id:kazukichi_0914:20210728172252g:plain

でも世界中に18億あるらしいんですよ。
そんなのを一件一件チェックしていたら大変です。

ウェブページがあるかないかはそのウェブページにアクセスするとわかります。
aaa.com aab.com aac.con…などのアドレスが存在するかいちいちチェックしていたら日が暮れます。
そのページがあるかないかをチェックするサクッとスクリプトを書いてみました。

const URL = 'https://a.hatenablog.com/'; // 監視したいサイトのURL
const EMAIL = 'xxxxxxxx@gmail.com'; // エラーを知らせるメールアドレス

function main() {

    if(isUrlDown()) { // サイトが落ちてたとき(メール通知)

        sendMail();

    } else {

        Logger.log('正常に作動しています'); // ログに出力

    }

}

function isUrlDown() {

    const response = UrlFetchApp.fetch(URL, {
        muteHttpExceptions: true // 例外処理はしないようにする
    });

    return (response.getResponseCode() !== 200); // HTTPステータスコードが、「200」以外はエラーとする

}

function sendMail() {

    const dateTime = Utilities.formatDate(new Date(), 'JST', 'yyyy年MM月dd日 HH:mm');

    MailApp.sendEmail({
        to: EMAIL,
        subject: '【サイトダウン】検知しました',
        htmlBody: `
            以下のURLでサイトダウンを検知しました。<hr>
            URL: <a href="${URL}">${URL}</a><br>
            日時: ${dateTime}
        `
    });

}
このスクリプトを実行するとこのサイトが存在するか否かのチェックを返す

f:id:kazukichi_0914:20210728173219g:plain

「当然こんなサイトは存在しないので、以下のURLでサイトダウンを検知しました」と通知が来ます。

【完全自動】自分の管理しているサイトの死活管理ツールを作ってみた!

ウェブサイトが動作しているかのチェックをしたい

たくさんのウェブサイトを運営していると、どのサイトがダウンしたかどうかを管理するのは大変です。
どのサイトが動いていて、どのサイトが落ちているのかを一元管理できたら楽なので、
死活管理ツールを作ってみました。

const URL = 'https://kazukichi0914.hatenablog.com/'; // 監視したいサイトのURL
const EMAIL = '****************@gmail.com'; // エラーを知らせるメールアドレス

function main() {

    if(isUrlDown()) { // サイトが落ちてたとき(メール通知)

        sendMail();

    } else {

        Logger.log('正常に作動しています'); // ログに出力
        MailApp.sendEmail({
        to: EMAIL,
        subject: 'サイトは動作します',
        htmlBody: `
            以下のURLでサイトは動作しています。<hr>
            URL: <a href="${URL}">${URL}</a><br>
            `
    });

    }

}

function isUrlDown() {

    const response = UrlFetchApp.fetch(URL, {
        muteHttpExceptions: true // 例外処理はしないようにする
    });

    return (response.getResponseCode() !== 200); // HTTPステータスコードが、「200」以外はエラーとする

}

function sendMail() {

    const dateTime = Utilities.formatDate(new Date(), 'JST', 'yyyy年MM月dd日 HH:mm');

    MailApp.sendEmail({
        to: EMAIL,
        subject: '【サイトダウン】検知しました',
        htmlBody: `
            以下のURLでサイトダウンを検知しました。<hr>
            URL: <a href="${URL}">${URL}</a><br>
            日時: ${dateTime}
        `
    });

}

とさくっと50行ほどのコードを書いてみました。

このコードを15分に一度、起動

f:id:kazukichi_0914:20210729170510g:plain

15分に一度、サイトのステータスを返します。

f:id:kazukichi_0914:20210729211056j:plain