GASで家事を効率化しよう

こんにちは forestechnologyです

早速ですがGAS(Google Apps Script )で家事管理をしてみたいと思います

~ 動作の解説 ~


まず空のスプレッドシートにヘッダーとテストデータを入れるメソッドを実行します
このときに列幅を微調整します

function initialize()
{

     const Inisheet = SpreadsheetApp.getActiveSheet();
     const InilastRow = Inisheet.getLastRow();


     /** No.	作業名	前回対応日	間隔	次回作業日	チェック */
     var header_No=Inisheet.getRange(1,1)
     var header_task=Inisheet.getRange(1,2)
     var header_preworkdate=Inisheet.getRange(1,3)
     var header_span=Inisheet.getRange(1,4)
     var header_nextworkdate=Inisheet.getRange(1,5)
     var header_check=Inisheet.getRange(1,6)
     
     header_No.setValue('No.')
     header_task.setValue('作業名')
     header_preworkdate.setValue('前回対応日')
     header_span.setValue('間隔')
     header_nextworkdate.setValue('次回作業日')
     header_check.setValue('チェック')
 
     /** CREATE TESTDATA */
     var i=2
     var test_No=Inisheet.getRange(i,1)
     var test_task=Inisheet.getRange(i,2)
     var test_preworkdate=Inisheet.getRange(i,3)
     var test_span=Inisheet.getRange(i,4)
     var test_nextworkdate=Inisheet.getRange(i,5)
     var test_check=Inisheet.getRange(i,6) 
     
     test_No.setValue('=IF(B2<>"", ROW()-1,"")')
     test_task.setValue('玄関掃除')
     test_preworkdate.setValue('2021/03/01')
     test_span.setValue('3')
     test_nextworkdate.setValue('=IF(C2<>"",C2+D2,"")')
     test_check.activate()
     test_check.insertCheckboxes()
     
     autofill()
     
     withformat()

     

}

function autofill() {
 var spreadsheet = SpreadsheetApp.getActive();
 spreadsheet.getRange('A2').activate();
 spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('A2:A100'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
 spreadsheet.getRange('E2').activate();
 spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('E2:E100'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
 spreadsheet.getRange('F2').activate();
 spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('F2:F100'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
 
};

function form() {
 var spreadsheet = SpreadsheetApp.getActive();
 spreadsheet.getRange('E2').activate();
 var conditionalFormatRules = spreadsheet.getActiveSheet().getConditionalFormatRules();
 conditionalFormatRules.push(SpreadsheetApp.newConditionalFormatRule()
 .setRanges([spreadsheet.getRange('E2')])
 .whenCellNotEmpty()
 .setBackground('#B7E1CD')
 .build());
 spreadsheet.getActiveSheet().setConditionalFormatRules(conditionalFormatRules);
 spreadsheet.getRange('E:E').activate();
 conditionalFormatRules = spreadsheet.getActiveSheet().getConditionalFormatRules();
 conditionalFormatRules.splice(conditionalFormatRules.length - 1, 1, SpreadsheetApp.newConditionalFormatRule()
 .setRanges([spreadsheet.getRange('E1:E1000')])
 .whenCellNotEmpty()
 .setBackground('#B7E1CD')
 .build());

 spreadsheet.getActiveSheet().setConditionalFormatRules(conditionalFormatRules);
 conditionalFormatRules = spreadsheet.getActiveSheet().getConditionalFormatRules();
 conditionalFormatRules.splice(conditionalFormatRules.length - 1, 1, SpreadsheetApp.newConditionalFormatRule()
 .setRanges([spreadsheet.getRange('E1:E1000')])
 .whenFormulaSatisfied('=$B1=""')
 .setBackground('#FFFFFF')
 .setFontColor('#FFFFFF')
 .build());

 
 spreadsheet.getActiveSheet().setConditionalFormatRules(conditionalFormatRules);
 spreadsheet.getRange('F:F').activate();
 conditionalFormatRules = spreadsheet.getActiveSheet().getConditionalFormatRules();
 conditionalFormatRules.splice(conditionalFormatRules.length - 1, 1, SpreadsheetApp.newConditionalFormatRule()
 .setRanges([spreadsheet.getRange('F1:F1000')])
 .whenFormulaSatisfied('=$B1=""')
 .setBackground('#FFFFFF')
 .setFontColor('#FFFFFF')
 .build());
 spreadsheet.getActiveSheet().setConditionalFormatRules(conditionalFormatRules);
};


function withformat() {
 var spreadsheet = SpreadsheetApp.getActive();
 spreadsheet.getRange('E:E').activate();

 var conditionalFormatRules = spreadsheet.getActiveSheet().getConditionalFormatRules();
 conditionalFormatRules.push(SpreadsheetApp.newConditionalFormatRule()
 .setRanges([spreadsheet.getRange('E1:E1000')])
 .whenCellNotEmpty()
 .build());

 spreadsheet.getActiveSheet().setConditionalFormatRules(conditionalFormatRules);
 conditionalFormatRules = spreadsheet.getActiveSheet().getConditionalFormatRules();
 conditionalFormatRules.splice(conditionalFormatRules.length - 1, 1, SpreadsheetApp.newConditionalFormatRule()
 .setRanges([spreadsheet.getRange('E2:E1000')])
 .whenDateBefore(SpreadsheetApp.RelativeDate.TODAY)
 .setBackground('#FFFFFF')
 .setFontColor('#FF0000')
 .build());

 spreadsheet.getActiveSheet().setConditionalFormatRules(conditionalFormatRules);
 spreadsheet.getRange('F:F').activate();
 conditionalFormatRules = spreadsheet.getActiveSheet().getConditionalFormatRules();
 conditionalFormatRules.push(SpreadsheetApp.newConditionalFormatRule()
 .setRanges([spreadsheet.getRange('E2:E1000')])
 .whenDateBefore(SpreadsheetApp.RelativeDate.TODAY)
 .setBackground('#FFFFFF')
 .setFontColor('#FF0000')
 .build());

 spreadsheet.getActiveSheet().setConditionalFormatRules(conditionalFormatRules);
 conditionalFormatRules = spreadsheet.getActiveSheet().getConditionalFormatRules();
 conditionalFormatRules.splice(conditionalFormatRules.length - 1, 1, SpreadsheetApp.newConditionalFormatRule()
 .setRanges([spreadsheet.getRange('F1:F1000')])
 .whenFormulaSatisfied('=$B1=""')
 .setBackground('#FFFFFF')
 .setFontColor('#FFFFFF')
 .build());
 spreadsheet.getActiveSheet().setConditionalFormatRules(conditionalFormatRules);
};


ヘッダーができたら家事の名称と前回対応日、間隔を
決めて入力していく
前回対応日+間隔=次回作業日となり
次回作業日を超過している場合は赤文字となります

画像1

次に完了したタスクを確認するメソッドを作成。
チェックボックスがチェックされているタスクの
前回作業日を本日とし、チェックを外す働きを持つ

function check()
{
 
 /** Get UsedRow */ 
   
 const sheet = SpreadsheetApp.getActiveSheet();
 const lastRow = sheet.getLastRow();

 for (var i=2 ; i <= lastRow; i++){
   var test=sheet.getRange(i,2)
   var lastworkday=sheet.getRange(i,3)
   var range=sheet.getRange(i,6)
   var date = new Date();

   if(test.getValue() == "")
   {
     break
   }

   if(range.getValue() == true)
   {
     lastworkday.setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd'))
     range.setValue(false)
   }
 }
}

このメソッドをトリガー実行に登録し
1分おきに動作するようにする

画像2

これで
家事の進捗状況が一目で分かるようになり

・空気清浄機のフィルターは1週間に1度
・エアコンのフィルターは2週間に1度
・洗濯槽の洗浄は1か月に1度

といった間隔の長い家事も次回の作業日が簡単に分かるようになった

家族と作成したスプレッドシートに招待することで
共有することもできる

GASってすばらしい。。。

ここまでお読みいただきありがとうございます!
今回ははじめてのGAS開発とはじめてのiMovieで動画作成
はじめてのYoutube投稿、なれないNote投稿まで
なんとか漕ぎ着けました

いろんなことに慣れていきたい2021年です


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