ななまるこちゃんのメモ

GASで作ったスクリプトを公開します

日付自動更新スプレッドシート

予約受付システムを作ったときにできたやつです。スプレッドシートをカレンダーのように運用できます。トリガー設定で一日一回起動にすれば、日付列が自動で更新されていきます。設定のシートから休日に指定した日付・曜日は書き込まれません。勉強しているうちにスプレッドシートじゃなくてgoogleカレンダー使えば良いことに気づいて要らなくなりました。

正直、何に使えるのか知らないので良い使い方があれば教えてほしいです。シフト表とか?

日付自動更新スプレッドシート - Google スプレッドシート


///グローバル定数///
const ss = SpreadsheetApp.getActiveSpreadsheet();//スプレッドシート本体取得
const sheetY = ss.getSheetByName('カレンダー');//シート「カレンダー」取得
const sheetS = ss.getSheetByName('設定');//シート「設定」取得
const min = 0;  //min×列数がセルの値になる
const any = 21;  //列数の最大数
///グローバル定数///



////分数が入った二次元配列をつくるFunction
function arrayFunc(putday,putany){
const sendArray = new Array(1);
sendArray[0]= new Array;
sendArray[0].push(putday);

for(let i = 0;i<=putany-1;i++)
 {
 sendArray[0].push(min*(putany-i))
 }

return sendArray;
}



///追加する日が特別休日と休日曜日と被っていれば+1日ずつ足してチェックするFunction
function checkFunc(putweek,putday,putholiday){  

 if(putweek.some(value=>value===putday.getDay()))
 {
   putday.setDate(putday.getDate()+1); //putdayを一日進める
   checkFunc(putweek,putday,putholiday); //再帰

 }else if(putholiday.some(value=>value===putday.getTime()))
 {  
   putday.setDate(putday.getDate()+1);
   checkFunc(putweek,putday,putholiday); //再帰
 }

return;

}

////★★シートを1日1回更新するファンクション(checkFancとaarayFancの呼び出し元)
function makeCalendar(){

const dayX = new Date(sheetY.getRange(14,1).getValue()); //14行目の日付を取得dayX
dayX.setDate(dayX.getDate()+1); //dayXを1日進める

//特別休日を配列代入、filter→空白セルを削除して、map→getTimeで変換して再配列
const holidayArray = sheetS.getRange(3,3,10,1).getDisplayValues().flat().filter(value=>value!=='').map(value=>new Date(value).getTime());      

//定休曜日を配列代入、filter→空白セルを削除して、map→数値に変換して再配列
const weekArray = sheetS.getRange(3,6,4,1).getDisplayValues().flat().filter(value=>value!=='').map(value=>Number(value)); 

checkFunc(weekArray,dayX,holidayArray); //checkFuncを呼び出してdayXを変換


//予約シートの追加・削除
sheetY.insertRows(15,1);  //15行目に空白行挿入
const lastArray = arrayFunc(dayX,any);  //新規行に挿入する配列取得
sheetY.getRange(15,1,1,any+1).setValues(lastArray); //空白行に配列挿入
sheetY.getRange(14,1,1,any+1).copyTo(sheetY.getRange(15,1),{formatOnly:true}); //14行目の書式コピー
sheetY.deleteRow(2);      //2行目を削除

}