一覧ページへ

H.Bの開発ブログ

主にIT系の記事を書く予定

【Google Apps Script】Googleドキュメントで無駄なく、日記を書けるようにしてみた。

< はじめに >

皆さんは日記を書いていますか?
書いている。また、これから書くつもりである方々はどのように日記を書きますか?
紙のノートに書く人もたくさんいるでしょうし、スマホのアプリなどで書かれる方も多いでしょう。
そこで、私は「Googleドキュメント」で日記を書くという方法を提案します。

私は日記を年始から書き始めたのですが、その時に日記を書くための環境に求めた条件は以下の3つ。

(1)柔軟である

  画像が添付できる。
  特定の項目について記録する場所が作れる。

(2)マルチプラットフォームで利用可能

  基本的には画面が大きく、入力しやすいPCで記録し、旅行先ではタブレットで日記をつけ、外出時のふとした時に日記を見返すときはスマホで見たい。

(3)セキュリティがしっかりしている

  個人製作のアプリで独自にサーバがあるタイプのはちょっと不安。

結果

Googleドキュメント使えばいいのでは?」という結論に行きつきました。

(1)柔軟である =>◎
  画像も自由に挿入できる。
  グラフ、表も作れる・・これ以上ないほど柔軟。
(2)マルチプラットフォームで利用可能=>◎
  Googleアカウントとブラウザさえあれば複数デバイスで利用可能。
  なので、Linuxとかでも使える。
(3)セキュリティ=>〇
  完璧なセキュリティは存在しないが、ほぼ完璧なセキュリティ。
  個人情報を収集されるとのうわさもあるが、もはや今更感。
 

しかし問題もあった

それは、純粋に無駄が多い。
Googleドキュメントで日記をつけるとき、年フォルダの中に月フォルダを作って、その中に日記ファイルを作るとしたとき、そのプロセスは以下の様になります。
(1)年フォルダ一覧から現在の年のフォルダを開くまたは作成する
(2)開いた年フォルダから現在の月のフォルダを開くまたは作成する
(3)開いた月フォルダにドキュメントファイルを新規作成する。
(4)ドキュメントファイルを開いて、タイトルに今日の日付を記録する。
(5)自分の中で決まった文章形式があれば編集する。
(6)日記を記録する。
(7)ファイルに名前を付けて保存する。

普通の日記アプリなどと比べ、どう考えても無駄が多いです。
数日程度の記録であれば、その無駄は小さなものですが日記は何年もつけることが多いです。やがてその無駄はどんどんと大きくなっていき気が付けばたくさんの時間を無駄にしていた。では時間が勿体ないと思います。

今回私が作ったプログラムでは、その無駄な作業を機械に自動的にやってもらおう。というものです。これを使えば、(1)~(5)、(7)のプロセスを省略して、大幅に無駄を削減することが可能です。

ソースコード

function Run(){
  const FOLDERID = "          ";

  const TEMPLATEID = "   ";

  const DIARYFIRSTNAME ="N-";
  const DIARYLASTNAME = "";
  // DIARYFIRSTNAME + "yyyy-MM-dd" + DIARYLASTNAME の様にファイルが生成される。
  // 例. << 2021-01-01 >>といった感じ

  const diaryApp = new DIARYAPP(FOLDERID,TEMPLATEID,DIARYFIRSTNAME,DIARYLASTNAME);
  // diaryApp.test();
  diaryApp.createDiary();
  

}

class DIARYAPP{
  constructor (folderid,templateid,firstname,lastname){
    this.FOLDER = DriveApp.getFolderById(folderid);
    this.TEMPLATE = DriveApp.getFileById(templateid);
    this.DATE = new Date();
    this.DIARYNAME = firstname + String(Utilities.formatDate(this.DATE,'Asia/Tokyo','yyyy-MM-dd')) + lastname;
  }
  test(){

    // console.log(this.checkExistFolder(DriveApp.getFolderById("1bp1URf1iss6QSlZpx0jxdpG_GbHuwqdO"),'2月'));
  }
  getStringFullYear(){
   return  String(this.DATE.getFullYear())
  }

  getStringMonth(){
    return String(this.DATE.getMonth() + 1)
  }
  
  getStringDate(){
    return String(this.DATE.getDate());
  }

  checkExistFolder(folder,name){
    //(親フォルダの場所,フォルダの名前)でそこにフォルダがあるかないかをチェック
    //console.log(folder.getName());
   
   // console.log(name);
    const exfolder = folder.getFoldersByName(name);
    if(exfolder.hasNext()){
     return true;
    }else{
     return false;
    }
  }
  
  getFolder(){
    const yfname = '' + this.getStringFullYear() + '年';
    //年相当のフォルダの名前
    const mfname = '' + this.getStringMonth() +'月';
    //月相当のフォルダの名前
    let mf;

    if(this.checkExistFolder(this.FOLDER,yfname)){
      const yf = this.FOLDER.getFoldersByName(yfname).next();
      if(this.checkExistFolder(yf,mfname)){
         mf = yf.getFoldersByName(mfname).next();
      }else{
         mf = yf.createFolder(mfname);
      }
    }else{
        const yf = this.FOLDER.createFolder(yfname);
         mf = yf.createFolder(mfname);
        return mf
    }
    return mf;
  }

  createDiary(){
    
    const folder = this.getFolder();
    var document = this.TEMPLATE.makeCopy(this.DIARYNAME,folder);
    var documentId = document.getId();

    var fileId = DriveApp.getFileById(documentId).getId();
  
    var activedocument = DocumentApp.openById(fileId);
    var body = activedocument.getBody();
    body.replaceText('yyyy',String(this.DATE.getFullYear()));
    body.replaceText('MM',String(this.DATE.getMonth()+1));
    body.replaceText('dd',String(this.DATE.getDate()));
    activedocument.saveAndClose();
  }
}

<このプログラムで何がおこるのか?>

現在の月に相当する月フォルダ内に'N-2021-01-16'といった名前のドキュメントファイルとして、テンプレートからコピーして生成する。
尚、年フォルダと月フォルダがない場合、自動的にフォルダを生成する。
その日記ファイルのyyyyを今の西暦に変更。MMを今月に変更。ddを今日の日付に変更する。
もし、決まったフォーマットがあった場合。
「今日よかったこと」や「今日頑張ったこと」などの項目をテンプレートファイルに設定しておけば、そこからコピーされて生成されるので、毎回同じことを書かなくてすむ。

<使うときの手順>

1.日記用のフォルダを作成する。
2.日記用のテンプレートを作成する。
1.Run() 内にあるFOLDERIDの値を日記のフォルダのIDに変更する。
2.同じくRun()内にあるTEMPLATEID の値を作成したテンプレートのファイルIDに設定する。
※このテンプレートをコピーして、日記ファイルは作られる。
3.同じくRun()内にある、DIARYFIRSTNAMEとDIARYLASTNAMEの値を設定する。
  DIARYFIRSTNAMEは日記ファイルの’2021-1-16’の前に設置されるワード(デフォルトでは'N-')
DIARYLASTNAME は後に設定されるワード(デフォルトでは何も設定されていない)
※もしデフォルトの'N-2021-01-16'のようなファイルの名前が嫌でなければ変えなくても特に問題はない。
4.プロジェクトのタイムゾーンを東京に設定する。
5.一回Run()関数を起動してみる。(テスト)
6.プロジェクトのトリガーを自分の好きな時間でRun()関数に設定する。
※指定した時間に日記が生成されます。

1、2で躓いた人へ。
halthybamboo.hatenablog.com

<筆者コメント>

自分でもまだまだ、コードに改良の余地があると思うので、ぜひもっと良いコードに自分で直してみてください。

halthybamboo.hatenablog.com
はこれを作るための副産物だったりします。

【Google Apps Script】IDってなに?

< IDってなに? >

フォルダーまたはファイルを一意に表すための値。

ちなみにGoogleDriveではこのIDが設定されているおかげで、Windows などでは同一の名前のフォルダやファイルは存在することができないが、GoogleDriveでは同じ名前のものが作れる。

 

< どこを見ればわかるの? >

フォルダの場合f:id:HalthyBamboo:20210114164158p:plain

フォルダを開いた時のURLの一番右側にある「1aXIkJ3Cvk44hJhD1B10pa_T4E04qYqx6」のような値のがフォルダのID。

 

ファイルの場合

 

f:id:HalthyBamboo:20210114165415p:plain

フォルダ同様、ファイル(ここではドキュメントファイル)を開いた時の/と/editの間にある、「1fQs-ZBSt6h5tcbecn1KaFKGql5CVysDDr3nuUu2VFJINw」のような値がファイルのID。

 

以上。

 

 

 

【Google Apps Script】自動で年のフォルダとその中に月のフォルダを作ってみた。

ソースコード

function CreateYearAndMonthDir(){
  const  FIRSTYEAR = 2020;
  //始まりの年
  const LASTYEAR = 2040;
  //終わりの年
  const FOLDERID= "(任意のフォルダid)";
 //フォルダたちの置き場所

  for(let i = 0; FIRSTYEAR + i<= LASTYEAR;i++){
    const  year = String(FIRSTYEAR + i) +"年";
    const  yearfolder = DriveApp.getFolderById(FOLDERID).createFolder(year);
    for(let i = 1; i <=12;i ++){
      const month = String(i) + "月";
      yearfolder.createFolder(month);
    }
  }
}

<このプログラムで何がおこるか?>

FIRSTYEARに設定した西暦からLASTYEARに設定した西暦までの「20XX年」という形式のフォルダが生成さる。
さらにそれぞれのフォルダ内では1月から12月まで「X月」という形式でフォルダが生成される。

<使うときの手順>

1.FIRSTYEAR=2020; の 2020の部分を任意の最初の年に設定する。
2.LASTYEAR =2040; の 2040の部分を1.と同様に任意の最後の年を設定する。
3.FOLDERIDに任意のフォルダのIDを設定する。

<筆者コメント>

簡単なプログラムですが、意外と需要がある気がします。
手作業で、フォルダを作るのはとても退屈な作業なのでぜひ活用していただけると幸いです。