【GAS】스프레드시트에 캘린더를 생성하고 싶다

13245 단어 GoogleAppsScriptgas

날짜 복사하여 달력 츠 군의 귀찮은



이것을

이렇게

이런 것이


귀찮아.

1개월분이라도 귀찮은데, 이것이 1년분이라도 되어 오면 커서 드래그하면서 "무엇에 시간을 걸고 있을까?"라는 기분이 들지 않습니까.

Date를 돌려 캘린더 배열에서 스프레드 시트로 뻗어 내고 싶다.



Date를 시작일부터 종료일까지 빙빙 돌려 2차원 배열로 저장하면 엔트



이런 2차원 배열[[null, 3/1, 3/2, 3/3, 3/4, 3/5, 3/6][3/7, 3/8, 3/9, 3/10, 3/11, 3/12, 3/13]...]

이번은 일요일 시작의 캘린더를 빙빙 돌려 생성합니다.



구현 코드는 아래와 같습니다.

캘린더 생성.gs
/**
* 定数系
*/
//カレンダー生成の開始日付用(スプレッドシートのセルから取得するように変えるといい)
var targetYear = 2021;
var targetMonth = 1;
var targetDate = 1;

// 今回、1週ごとに下に空白行をいれたいので、何行空行を生成するかの変数
var brCount = 2;

// Dateオブジェクト生成 new Data(年、月、日、時間、分、秒);
// 月に関してはインデックスが0スタートなので、-1しています
var countUpDate = new Date(targetYear, targetMonth - 1, targetDate, 0, 0, 0); //開始日付からの加算用
var endDate = new Date(targetYear, targetMonth - 1, targetDate, 0, 0, 0); //終了日付

// 今回は1年分出力しようと思うので、終了日付のYearを+1します。
endDate.setFullYear(endDate.getFullYear() + 1);

var monChkCd = countUpDate.getMonth(); // 月変わり判定用の変数

var w = 0; // 1行あたり列数カウント用
// 開始列を設定したいので開始日の曜日を取得
//(月曜スタートの場合は開始日付の列-1からスタートするといいです)
w = countUpDate.getDay();

var r = 0; // 行数カウント用
var calArr = []; // カレンダー配列
calArr[r] = []; // 1行分の配列を初期化

/**
* メイン処理
*/
while(countUpDate.getTime() < endDate.getTime()) {
    // カレンダー配列に日付を格納
    calArr[r][w] = Utilities.formatDate(countUpDate, 'JST', 'yyyy/MM/dd');
    countUpDate.setDate(countUpDate.getDate() + 1); // 日付加算
    w++; // 列数加算

    if(w > 6) {
        // 1週間分セットしたら改行
        w = 0; // 列数を初期化
        r++; // 行数を加算
        calArr[r] = []; // 次の行を格納するために配列初期化
        for (var j = 1; j <= brCount; j++) {
            //空行追加処理
            calArr[r] = [null,null,null,null,null,null,null]; // 空行埋める用
            r++;
            calArr[r] = [];
        }
    }

    if (countUpDate.getMonth() > monChkCd || (countUpDate.getMonth() === 0 && monChkCd === 11)) {
        // 月が変わった OR 年を越したら改行
        monChkCd = countUpDate.getMonth();
        if (w != 0) {
            // 行内が詰まっていない場合は残り列を詰める処理
            for (var j = w; j <= 6; j++) {
                calArr[r][j] = null; // null埋め
            }
        } else {
            calArr[r] = [null,null,null,null,null,null,null];
        }
        r++;
        calArr[r] = [];
    }
}

//終了日付まで処理したら処理を終了し、残り列のnull埋め処理
for (var j = w; j <= 6; j++) {
    calArr[r][j] = null; // null埋め
}

좀 더 바삭하게하는 방법도 있을지도…? 라고 생각하면서 우선은 어리석게 빙빙 돌려 보았습니다.
나머지는

SpreadsheetApp.getActiveSheet().getRange(2, 1, r + 1, 7)
    .setValues(calArr)
    .setHorizontalAlignment('center') //中央揃え
    .setVerticalAlignment('middle')
    .setNumberFormat('MM/dd');

라는 느낌으로 배열을 시트에 출력해 주면 OK.

요일별 색 처리에 대해



요일마다 색칠하는 처리도 생각했습니다만, 그 날이 공휴일인지 판정해 색을 붙이는 처리를 생각했을 때에 1회 1회 셀에 액세스 할 필요가 나올 것 같다고 생각했으므로, 일단 보류 했습니다.
(셀에의 액세스 횟수가 늘어나면 처리도 늦게 무거워지기 때문에…
아, 하지만 공휴일 마스터 만들어 조건부 서식 등으로 처리할 수 있도록 하면 좋을까……?

나중에 조금 추가로 생각해 보겠습니다.

좋은 웹페이지 즐겨찾기