GASで月間スケジュールのテンプレートを作成してみた


月間スケジュールのフォーマット作成

職場でもプライベートでも月間スケジュールの確認は必要だと思います。
そういうことで月間スケジュールのフォーマットを作ることが出来るGASのコードです。
対象月はプルダウンで選択できます。

GASのファイルは3つ用意しました。
1つ目はただフォーマットを作るコード データの記録が不要な場合にはこれで十分
②2つ目は対象月を選択して、スケジュールやタスクなどを入力したらシート(データ)に保存するコード
③3つ目は対象月を選択して、実行すると過去に入力したデータを読み込むコード

【準備ファイル】
①のだけでいい場合…テンプレート作成というコードだけでいいと思います。
②③も含める場合…テンプレート作成、データ書き込み、データ読み込みのコード

フォーマット
対象月選択
データ書き込み
データ読み込み

GASとは

GASは簡単に言えばグーグルが提供しているプログラミング言語です。無料で利用できます。

このサンプルコード

GASをある程度知っている方…下のコードをコピペすれば完了です。
GASをあまりよく分からない方…コードの下に説明を詳しく入れています。ご参照ください。

テンプレート作成 のコード

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('月間スケジュール')
    .addItem('テンプレート作成', 'テンプレート作成')
    .addItem('書込み', 'データ書き込み')
    .addItem('読込み', 'データ読み込み')
    .addToUi();
}

function テンプレート作成() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  
  // データシートを作成
  const dataSheetName = 'データ';
  let dataSheet = spreadsheet.getSheetByName(dataSheetName);
  
  // シートが存在する場合、削除するか確認
  if (dataSheet) {
    const ui = SpreadsheetApp.getUi();
    const response = ui.alert(
      '確認',
      'シート「データ」は既に存在します。削除して新しいシートを作成してもよろしいですか?',
      ui.ButtonSet.YES_NO
    );
    
    // ユーザーが「NO」を選んだ場合、処理を終了
    if (response == ui.Button.NO) {
      return;
    }
    spreadsheet.deleteSheet(dataSheet); // シートを削除
  }
  
  // 新しいデータシートを作成
  dataSheet = spreadsheet.insertSheet(dataSheetName);
  
  // 日付範囲(2024/11~2026/12)をA列からZ列まで入力
  const startDate = new Date(2024, 10); // 2024年11月
  const endDate = new Date(2026, 11); // 2026年12月
  const dates = [];
  
  let currentDate = startDate;
  while (currentDate <= endDate) {
    const year = currentDate.getFullYear();
    const month = ('0' + (currentDate.getMonth() + 1)).slice(-2); // 月を2桁にする
    dates.push(`${year}/${month}`);
    currentDate.setMonth(currentDate.getMonth() + 1); // 次の月に移動
  }
  
  // A列からZ列まで入力
  dataSheet.getRange(1, 1, 1, dates.length).setValues([dates.slice(0, 26)]);
  
  // スケジュールシートを作成
  const scheduleSheetName = 'スケジュール';
  let scheduleSheet = spreadsheet.getSheetByName(scheduleSheetName);
  
  // シートが存在する場合、削除するか確認
  if (scheduleSheet) {
    const ui = SpreadsheetApp.getUi();
    const response = ui.alert(
      '確認',
      'シート「スケジュール」は既に存在します。削除して新しいシートを作成してもよろしいですか?',
      ui.ButtonSet.YES_NO
    );
    
    // ユーザーが「NO」を選んだ場合、処理を終了
    if (response == ui.Button.NO) {
      return;
    }
    spreadsheet.deleteSheet(scheduleSheet); // シートを削除
  }
  
  // 新しいスケジュールシートを作成
  scheduleSheet = spreadsheet.insertSheet(scheduleSheetName);

  // C1にプルダウンで「データ」シートの1行目をA列からZ列まで設定(表示形式 yyyy/mm)
  const range = dataSheet.getRange(1, 1, 1, 26);
  const values = range.getValues()[0].filter(String);
  
  // 日付形式(yyyy/mm)に変換
  const formattedValues = values.map(value => {
    const date = new Date(value);
    return Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy/MM');
  });
  
  const rule = SpreadsheetApp.newDataValidation()
    .requireValueInList(formattedValues, true)
    .build();
  scheduleSheet.getRange('C1').setDataValidation(rule);

  // D1に「月間スケジュール」
  scheduleSheet.getRange('D1').setValue('月間スケジュール');

  // C1:D1を太字でフォントサイズ14
  scheduleSheet.getRange('C1:D1').setFontWeight('bold').setFontSize(14);

  // セルに値とフォーマット
  scheduleSheet.getRange('A3').setValue('■スケジュール');
  scheduleSheet.getRange('E3').setValue('■タスク');
  scheduleSheet.getRange('A4').setValue('日付');
  scheduleSheet.getRange('B4').setValue('曜日');
  scheduleSheet.getRange('C4').setValue('スケジュール内容');
  scheduleSheet.getRange('E4').setValue('タスク内容');
  scheduleSheet.getRange('F4').setValue('重要度');
  scheduleSheet.getRange('G4').setValue('期日');

  scheduleSheet.getRange('A3:C4').setBackground('#E0F7E0').setFontWeight('bold');
  scheduleSheet.getRange('E3:G4').setBackground('#E0F7E0').setFontWeight('bold');

  // A5に関数=if(C1="","",C1)を設定し、表示形式を「d」
  scheduleSheet.getRange('A5').setFormula('=IF(C1="","",C1)').setNumberFormat('d');

  // A6:A35に動的に日付関数
  scheduleSheet.getRange('A6:A35').setFormula('=IF(AND(MONTH(A5)=MONTH(A5+1),A5<>""),A5+1,"")');

  // B5:B35に曜日の関数
  scheduleSheet.getRange('B5:B35').setFormula('=IF(A5="","",TEXT(A5,"ddd"))');

  // F5:F35にプルダウンでA、B、C
  const priorityRule = SpreadsheetApp.newDataValidation()
    .requireValueInList(['A', 'B', 'C'], true)
    .build();
  scheduleSheet.getRange('F5:F35').setDataValidation(priorityRule);

  // A37に【MEMO】
  scheduleSheet.getRange('A37').setValue('【MEMO】');

  // A38:G42の範囲を取得
  const range2 = scheduleSheet.getRange('A38:G42');
  range2.setBorder(false, false, true, false, false, true); // 下側の罫線のみを設定

  // 背景色
  scheduleSheet.getRange('A5:B35').setBackground('#E0E0E0'); // 明るいグレー2
  scheduleSheet.getRange('C5:C35').setBackground('#FFF8DC'); // 明るい黄3
  scheduleSheet.getRange('E5:G35').setBackground('#FFF8DC'); // 明るい黄3
  scheduleSheet.getRange('C1').setBackground('#FFF8DC');

  // 列幅
  scheduleSheet.setColumnWidth(1, 50); // A列
  scheduleSheet.setColumnWidth(2, 50); // B列
  scheduleSheet.setColumnWidth(3, 240); // C列
  scheduleSheet.setColumnWidth(4, 40); // D列
  scheduleSheet.setColumnWidth(5, 200); // E列
  scheduleSheet.setColumnWidth(6, 50); // F列
  scheduleSheet.setColumnWidth(7, 80); // G列

  // 行の高さを25
  scheduleSheet.setRowHeights(1, 42, 25);

  // 表全体のセルの表示位置を中央揃え
  scheduleSheet.getRange('A1:G42').setVerticalAlignment('middle');
}


データ書き込み のコード

function データ書き込み() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var scheduleSheet = ss.getSheetByName('スケジュール');
  var dataSheet = ss.getSheetByName('データ');

  // スケジュールシートのC1の値を取得
  var scheduleDate = scheduleSheet.getRange('C1').getValue();

  // データシートの1行目の値を取得
  var dataRow = dataSheet.getRange('A1:Z1').getValues()[0];
  var targetColumn = -1; // 対象列を初期化

  // C1と一致する列を探す
  for (var i = 0; i < dataRow.length; i++) {
    if (dataRow[i] instanceof Date) {
      var dataDate = Utilities.formatDate(dataRow[i], Session.getScriptTimeZone(), 'yyyy/MM');
      if (dataDate === Utilities.formatDate(scheduleDate, Session.getScriptTimeZone(), 'yyyy/MM')) {
        targetColumn = i + 1; // 対象列を設定(1列目から始まるので+1)
        break;
      }
    }
  }

  if (targetColumn === -1) {
    SpreadsheetApp.getUi().alert('指定した日付が見つかりませんでした。');
    return;
  }

  // スケジュールシートの各範囲の値を取得
  var valuesC = scheduleSheet.getRange('C5:C35').getValues();
  var valuesE = scheduleSheet.getRange('E5:E35').getValues();
  var valuesF = scheduleSheet.getRange('F5:F55').getValues();
  var valuesG = scheduleSheet.getRange('G5:G55').getValues();
  var valuesA = scheduleSheet.getRange('A38:A42').getValues();
  var valuesAB = scheduleSheet.getRange('B38:B42').getValues();
  var valuesAC = scheduleSheet.getRange('C38:C42').getValues();
  var valuesAD = scheduleSheet.getRange('D38:D42').getValues();
  var valuesAE = scheduleSheet.getRange('E38:E42').getValues();
  var valuesAF = scheduleSheet.getRange('F38:F42').getValues();
  var valuesAG = scheduleSheet.getRange('G38:G42').getValues();

  // 各範囲の値をデータシートの対象列の指定行に書き込む
  dataSheet.getRange(2, targetColumn, valuesC.length, 1).setValues(valuesC);     // 2行目~32行目に書き込む
  dataSheet.getRange(33, targetColumn, valuesE.length, 1).setValues(valuesE);    // 33行目~65行目に書き込む
  dataSheet.getRange(64, targetColumn, valuesF.length, 1).setValues(valuesF);    // 66行目~96行目に書き込む
  dataSheet.getRange(95, targetColumn, valuesG.length, 1).setValues(valuesG);    // 97行目~127行目に書き込む
  dataSheet.getRange(126, targetColumn, valuesA.length, 1).setValues(valuesA);   // 128行目~132行目に書き込む
  dataSheet.getRange(131, targetColumn, valuesAB.length, 1).setValues(valuesAB);
  dataSheet.getRange(136, targetColumn, valuesAC.length, 1).setValues(valuesAC);   // 128行目~132行目に書き込む
  dataSheet.getRange(141, targetColumn, valuesAD.length, 1).setValues(valuesAD);
  dataSheet.getRange(146, targetColumn, valuesAE.length, 1).setValues(valuesAE);   // 128行目~132行目に書き込む
  dataSheet.getRange(151, targetColumn, valuesAF.length, 1).setValues(valuesAF);
  dataSheet.getRange(156, targetColumn, valuesAG.length, 1).setValues(valuesAG);

  // スケジュールシートの指定範囲をクリア
  scheduleSheet.getRange('C5:G35').clearContent();
 scheduleSheet.getRange('A38:F42').clearContent();
  
  // 完了メッセージの表示
  SpreadsheetApp.getUi().alert('記録が完了しました。');
}


データ読み込み のコード

function データ読み込み() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var scheduleSheet = ss.getSheetByName('スケジュール');
  var dataSheet = ss.getSheetByName('データ');

  // スケジュールシートのC1の値を取得
  var scheduleDate = scheduleSheet.getRange('C1').getValue();

  // データシートの1行目の値を取得
  var dataRow = dataSheet.getRange('A1:Z1').getValues()[0];
  var targetColumn = -1; // 対象列を初期化

  // C1と一致する列を探す
  for (var i = 0; i < dataRow.length; i++) {
    if (dataRow[i] instanceof Date) {
      var dataDate = Utilities.formatDate(dataRow[i], Session.getScriptTimeZone(), 'yyyy/MM');
      if (dataDate === Utilities.formatDate(scheduleDate, Session.getScriptTimeZone(), 'yyyy/MM')) {
        targetColumn = i + 1; // 対象列を設定(1列目から始まるので+1)
        break;
      }
    }
  }

  if (targetColumn === -1) {
    SpreadsheetApp.getUi().alert('指定した日付が見つかりませんでした。');
    return;
  }

  // データシートからの値を取得
  var valuesC = dataSheet.getRange(2, targetColumn, 31, 1).getValues();  // 2行目~32行目(31行)
  var valuesE = dataSheet.getRange(33, targetColumn, 31, 1).getValues(); // 33行目~63行目(31行)
  var valuesF = dataSheet.getRange(64, targetColumn, 31, 1).getValues(); // 64行目~94行目(31行)
  var valuesG = dataSheet.getRange(95, targetColumn, 31, 1).getValues(); // 95行目~125行目(31行)
  var valuesA = dataSheet.getRange(126, targetColumn, 5, 1).getValues();  // 126行目~130行目(5行)
  var valuesA = dataSheet.getRange(126, targetColumn, 5, 1).getValues();
  var valuesAB = dataSheet.getRange(131, targetColumn, 5, 1).getValues();
  var valuesAC = dataSheet.getRange(136, targetColumn, 5, 1).getValues(); 
  var valuesAD = dataSheet.getRange(141, targetColumn, 5, 1).getValues();
  var valuesAE = dataSheet.getRange(146, targetColumn, 5, 1).getValues(); 
  var valuesAF = dataSheet.getRange(151, targetColumn, 5, 1).getValues();
  var valuesAG = dataSheet.getRange(156, targetColumn, 5, 1).getValues(); 
  
  // 各範囲の値をスケジュールシートに書き込む
  scheduleSheet.getRange('C5:C35').setValues(valuesC); // 31行
  scheduleSheet.getRange('E5:E35').setValues(valuesE); // 31行
  scheduleSheet.getRange('F5:F35').setValues(valuesF); // 31行に修正
  scheduleSheet.getRange('G5:G35').setValues(valuesG); // 31行に修正
  scheduleSheet.getRange('A38:A42').setValues(valuesA); // 5行
  scheduleSheet.getRange('B38:B42').setValues(valuesAB); 
  scheduleSheet.getRange('C38:C42').setValues(valuesAC); 
  scheduleSheet.getRange('D38:D42').setValues(valuesAD); 
  scheduleSheet.getRange('E38:E42').setValues(valuesAE); 
  scheduleSheet.getRange('F38:F42').setValues(valuesAF); 
  scheduleSheet.getRange('G38:G42').setValues(valuesAG); 

  // 完了メッセージの表示
  SpreadsheetApp.getUi().alert('読込みが完了しました。');
}

GASの基本から

Dドライブにアクセスして、スプレッドシートを開きます。
拡張機能からAppScriptを選択します。

下のような画面が出てきたら、function myfunctionと書かれている部分をすべて消します。

次に上記のコードをすべて選択して貼り付けます。
保存を押し、実行を押します。

以下、赤印で囲んだところを選択

実行ログに実行完了と表示されたら、スプレッドシートを見て下さい。
完成です。

備考

特にないです。

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