Google Apps Script

GAS(Google Apps Script)でスプレッドシートにカレンダーを自動作成する Part.2

スポンサーリンク

概要

前回、「GAS(Google Apps Script)でスプレッドシートにカレンダーを自動作成する」で、カレンダーを、GAS(Google Apps Script)で自動作成をする方法を説明しました。

GAS(Google Apps Script)でスプレッドシートにカレンダーを自動作成する

GAS(Google Apps Script)でスプレッドシートにカレンダーを自動作成する

概要スプレッドシートで、以下のようなカレンダーを、GAS(Google Apps Script)で自動作成をする方法です。プロジェクトの作成Googleドライブの左上「+新規」をクリックします。「その他」→「Google Apps Scri

今回は以下のようなスケジュールカレンダーをGASで自動作成ををする方法です。

プロジェクトの作成

プロジェクトの作成方法は、前回の記事の「プロジェクトの作成」を参照してください。

ソースコード

200行以上の長いソースコードです。コピペをする際は注意してください。

/**
 * カレンダーの作成
 * マイドライブへ「カレンダー」というスプレッドシートを作成します。
 */
function create_calendar() {

  /**
   * 見出し行のテキストスタイル
   */
  const HEADER_TEXT_STYLE = SpreadsheetApp.newTextStyle().setFontSize(16).setBold(true).build();

  /**
   * カレンダーのテキストスタイル
   */
  const CALENDAR_TEXT_STYLE = SpreadsheetApp.newTextStyle().setFontSize(11).setBold(true).build();

  // -----------------------------------------

  /**
   * スプレッドシートの作成
   */
  let spreadsheet = SpreadsheetApp.create("カレンダー");
  spreadsheet.setSpreadsheetLocale("ja_JP");
  spreadsheet.setSpreadsheetTimeZone("Asia/Tokyo");

  // シート名の変更
  let sheet = spreadsheet.getSheets()[0];
  sheet.setName("カレンダー");

  /**
   * 列の追加削除
   */
  if (sheet.getMaxColumns() < 32) {
    sheet.insertColumns(1, 32 - sheet.getMaxColumns());
  }
  else if (32 < sheet.getMaxColumns()) {
    sheet.deleteColumns(1, sheet.getMaxColumns() - 32);
  }
  // 列の幅を初期化
  sheet.setColumnWidths(1, sheet.getMaxColumns(), 25);

  /**
   * 行の追加削除
   */
  if (sheet.getMaxRows() < 34) {
    sheet.insertRows(1, 34 - sheet.getMaxRows());
  }
  else if (34 < sheet.getMaxRows()) {
    sheet.deleteRows(34, sheet.getMaxRows() - 34);
  }
  // 行の高さを初期化
  sheet.setRowHeights(1, sheet.getMaxRows(), 21);

  /**
   * 見出し行
   */
  // 年(入力欄)
  var tmpRange = sheet.getRange("C1:E1");
  tmpRange.merge();
  // 条件付き書式(未入力の場合)
  var tmpRule = SpreadsheetApp.newConditionalFormatRule()
    .whenCellEmpty()
    .setBackground("#f4cccc")
    .setRanges([tmpRange])
    .build();
  var rules = sheet.getConditionalFormatRules();
  rules.push(tmpRule);
  sheet.setConditionalFormatRules(rules);

  // 年
  var tmpRange = sheet.getRange("F1:G1");
  tmpRange.merge();
  tmpRange.setValue("年");

  // 月(入力欄)
  var tmpRange = sheet.getRange("H1:I1");
  tmpRange.merge();
  // 条件付き書式(未入力の場合)
  var tmpRule = SpreadsheetApp.newConditionalFormatRule()
    .whenCellEmpty()
    .setBackground("#f4cccc")
    .setRanges([tmpRange])
    .build();
  var rules = sheet.getConditionalFormatRules();
  rules.push(tmpRule);
  sheet.setConditionalFormatRules(rules);

  // 月
  var tmpRange = sheet.getRange("J1:K1");
  tmpRange.merge();
  tmpRange.setValue("月");

  var tmpRange = sheet.getRange("C1:K1");
  tmpRange.setTextStyle(HEADER_TEXT_STYLE);
  tmpRange.setHorizontalAlignment("center");
  tmpRange.setVerticalAlignment("middle");

  // カレンダー(見出し)
  var tmpRange = sheet.getRange("M1:AD1");
  tmpRange.merge();
  tmpRange.setValue("カレンダー");
  tmpRange.setTextStyle(HEADER_TEXT_STYLE);
  tmpRange.setHorizontalAlignment("center");
  tmpRange.setVerticalAlignment("middle");

  /**
   * スケジュールカレンダー
   */
  // 日(見出し)
  var tmpRange = sheet.getRange("A2:B2");
  tmpRange.merge();
  tmpRange.setValue("日");

  // 曜日(見出し)
  var tmpRange = sheet.getRange("C2:D2");
  tmpRange.merge();
  tmpRange.setValue("曜日");

  // 祝日(見出し)
  var tmpRange = sheet.getRange("E2:I2");
  tmpRange.merge();
  tmpRange.setValue("祝日");

  // 予定など(見出し)
  var tmpRange = sheet.getRange("J2:AF2");
  tmpRange.merge();
  tmpRange.setValue("予定など");

  // 見出し
  var tmpRange = sheet.getRange("A2:AF2");
  tmpRange.setTextStyle(CALENDAR_TEXT_STYLE);
  tmpRange.setHorizontalAlignment("center");
  tmpRange.setVerticalAlignment("middle");
  tmpRange.setBorder(true, true, true, true, true, true);

  // カレンダー(日付部分)
  for (var i = 0; i < 31; i++) {
    // 日
    var tmpRange = sheet.getRange(i + 3, 1, 1, 2);
    tmpRange.merge();
    tmpRange.setNumberFormat("d");
    if (i == 0) {
      tmpRange.setValue(`=if(or($C$1="",$H$1=""),"",date($C$1,$H$1,1))`);
    }
    else {
      var beforeCell = sheet.getRange(i + 2, 1).getA1Notation();
      tmpRange.setValue(`=if(${beforeCell}="","",if(month(${beforeCell}+1)=$H$1,${beforeCell}+1,""))`);
    }

    // 曜日
    var tmpRange = sheet.getRange(i + 3, 3, 1, 2);
    tmpRange.merge();
    tmpRange.setNumberFormat("ddd");
    tmpRange.setHorizontalAlignment("center");
    var beforeCell = sheet.getRange(i + 3, 1).getA1Notation();
    tmpRange.setValue(`=if(${beforeCell}="","",${beforeCell})`);

    // 祝日
    var tmpRange = sheet.getRange(i + 3, 5, 1, 5);
    tmpRange.merge();
    
    // 予定など
    var tmpRange = sheet.getRange(i + 3, 10, 1, 23);
    tmpRange.merge();

    // 行全体
    var tmpRange = sheet.getRange(i + 3, 1, 1, 32);
    tmpRange.setTextStyle(CALENDAR_TEXT_STYLE);
    tmpRange.setVerticalAlignment("middle");
    tmpRange.setBorder(true, true, true, true, true, true);
  }

  // カレンダーの行の高さの変更
  sheet.setRowHeights(2, 32, 37);

  // カレンダー全体
  var tmpRange = sheet.getRange(3, 1, 31, 32);

  var rules = sheet.getConditionalFormatRules();

  // 条件付き書式(土曜の場合)
  var tmpRule = SpreadsheetApp.newConditionalFormatRule()
    .whenFormulaSatisfied(`=if(text($A3,"ddd")="土",true,false)`)
    .setFontColor("#00f")
    .setRanges([tmpRange])
    .build();
  rules.push(tmpRule);
  
  // 条件付き書式(日曜の場合)
  var tmpRule = SpreadsheetApp.newConditionalFormatRule()
    .whenFormulaSatisfied(`=if(text($A3,"ddd")="日",true,false)`)
    .setFontColor("#f00")
    .setRanges([tmpRange])
    .build();
  rules.push(tmpRule);

  // 条件付き書式(祝日欄に入力がある場合)
  var tmpRule = SpreadsheetApp.newConditionalFormatRule()
    .whenFormulaSatisfied(`=if($E3="",false,true)`)
    .setFontColor("#f00")
    .setRanges([tmpRange])
    .build();
  rules.push(tmpRule);

  // 条件付き書式の設定
  sheet.setConditionalFormatRules(rules);
}

実行方法

メニューで「create_calendar」が選択されていることを確認して、「実行」をクリックします。

作成されたカレンダーの確認

カレンダーの出力場所

実行をすると、「マイドライブ」の直下に「カレンダー」というスプレッドシートが作成されます。
必要に応じてスプレッドシート名を変更したり、フォルダの移動をしてください。

カレンダーの使い方

作成された「カレンダー」というスプレッドシートを開くと、年と月のセルが赤くなっていますので、そちらに表示させたい年と月を半角数字で入力してください。

年と月を入力すると、日付の部分は関数が埋め込まれているので自動で表示されます。

  • ページの向きを「縦向き」、スケールを「幅に合わせる」としたらA4に綺麗に印刷ができると思います。
  • 祝日欄へ祝日名を入れると赤文字になるように条件付き書式が設定されています。
  • レイアウトの変更などは使いやすいように自由に行なってください。
  • あくまで無料のサンプルコードです。使用する場合はご自身の利用に合うかご確認の上使用をしてください。
タイトルとURLをコピーしました