【GAS実践ガイド】日付データを使いこなす!GASで週報・月報作成の効率化テクニック

日付データをもとにデータを作成

スプレッドシートに蓄積したデータをもとに、週報や月報を作成する際に、各データが何年何月のデータか、何週目のデータかをまとめる必要が出てきます。

その際、手入力で情報をまとめると多くの時間を消費するので、ベストな解決策としては、日付データをもとに、下記の画像のように様々なデータを作成することです。

このようなデータのつくりをすれば、スプレッドシート上でデータを週単位、月単位でまとめることができるのはもちろんですが、Looker Studioでレポートを作成する際に役立ちます。

LookerStudioとは 【初心者必見】LookerStudioとは、活用方法と事例をサンプル付きで紹介

今回、GASを使用して作成するデータは下記の項目です。

GASで作成する項目

日付データをもとに、年月、年、その月の何週目か、ISO基準の週(年単位の週)、曜日

このGASを使うメリット

週報や月報の作成において、日付データを効率的に活用することが求められますが、手入力では時間がかかりすぎることが課題です。

この記事では、Google Apps Script (GAS) を使って日付データをもとに、スプレッドシート上で週報や月報のデータ集計を劇的に簡単に行う方法を解説します。

記事を読むことで、日付データを活用した週報・月報作成の効率化が実現でき、手間を大幅に削減できるようになります。

また、自動生成された年月、週、曜日などの情報を使って、データ分析やレポート作成の精度を高めることができるようになります。

この記事を読んで、スプレッドシートを使いこなし、業務の効率化に貢献しましょう。

作成したいデータを確認

日付を元に作りたい項目

今回はA列の”稼働日”というデータをもとに、黄色の項目を作成します。

完成イメージは下図の通り。

実現したい実行結果

このようなデータが作れれば、週単位、月単位、年単位の集計が可能となります

早速、作成したコードを確認しましょう。

作成したコード

GAS
function updateSpreadsheet() {
 //ssUrlには対象のスプレッドシートのURLが入ります。''内をご自身のスプレッドシートURLに置き換えてください。
  const ssUrl = 'https://docs.google.com/spreadsheets/d/1';
  const sheetName = '月報週報';
  const originColName = '稼働日';
  const targetColNames = ['稼働年', '稼働年月', '稼働年_int', '稼働年月_int', '稼働週', '稼働週ISO', '稼働曜日'];
  
  const ss = SpreadsheetApp.openByUrl(ssUrl);
  const sheet = ss.getSheetByName(sheetName);
  const lastRow = sheet.getLastRow();
  const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  const originColIndex = headers.indexOf(originColName) + 1;
  const originDates = sheet.getRange(2, originColIndex, lastRow - 1).getValues().flat();
  let outputData = [];
  
  for (const dateString of originDates) {
    if (dateString) {
      const date = new Date(dateString);
      const year = date.getFullYear();
      const month = date.getMonth() + 1;
      const weekOfMonth = Math.ceil((date.getDate() - date.getDay()) / 7);
      const weekIso = Utilities.formatDate(date, ss.getSpreadsheetTimeZone(), "w");
      const dayOfWeek = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"][date.getDay()];
      
      const rowData = [
        `${year}年`,
        `${year}年${String(month).padStart(2, '0')}月`,
        year,
        month,
        `${weekOfMonth}週目`,
        `${weekIso}週目`,
        dayOfWeek
      ];
      outputData.push(rowData);
    } else {
      outputData.push(Array(targetColNames.length).fill(''));
    }
  }
  
  const targetColIndexes = targetColNames.map(name => headers.indexOf(name) + 1);
  for (let i = 0; i < targetColNames.length; i++) {
    const colData = outputData.map(row => [row[i]]);
    sheet.getRange(2, targetColIndexes[i], colData.length).setValues(colData);
  }
  
  Logger.log('スプレッドシートへのデータ更新が完了しました。');
}

こちらが作成したコードです。

必要箇所を変更していただければ、そのままご使用いただくことが可能です。

コードの作成要件

要件の概要は、「特定の日付データをもとに、指定したデータを作成する」という内容です。

そして、今回コード作成に当たってPointとなる点は以下の通りです。

  • 値の出力は、処理速度向上のために、一つずつセルへ入力するのではなく、まとめて対象のセルへ入力するコードにしています。
  • 列名は既にスプレッドシートの1行目に用意されているため、2行目以降に値を入力します。
  • 対象の列名を列番号ではなく、列名で指定しています(targetColNames)。
  • 元になるデータ(今回はA列)の最終行まで処理を繰り返す。
  • 空のデータに対しては、何も書き込まずにスキップするようにしています。

上記がコードの簡単なポイントで、下記が各項目の内容です。

各項目の定義

稼働年:年のみを入力(2023年)
稼働年月:年月を入力(2023年01月)
稼働年_int:年のみを数値で入力(2023)
稼働年月_int:月のみを数値で入力(01)
稼働週:当月の何週目かを入力(1週目)
稼働週ISO:当年の何週目かをISO基準で入力(12週目)
稼働曜日:何曜日かを入力(木曜日)

それでは、各項目の解説をしていきます。

コードの解説

GAS
function updateSpreadsheet() {

updateSpreadsheet という名前の関数を定義します。

この関数はスプレッドシートのデータを更新する役割を持っています。

GAS
  const ssUrl = '...';
  const sheetName = '月報週報';
  const originColName = '稼働日';
  const targetColNames = [...];

スプレッドシートのURL、シート名、元になる列名、対象の列名を定数として宣言します。

これらは処理の対象となるスプレッドシートや列に関する情報です。

GAS
  const ss = SpreadsheetApp.openByUrl(ssUrl);
  const sheet = ss.getSheetByName(sheetName);

SpreadsheetApp.openByUrl() 関数を使ってスプレッドシートを開き、getSheetByName() 関数で指定されたシート名のシートを取得します。

GAS
  const lastRow = sheet.getLastRow();
  const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  const originColIndex = headers.indexOf(originColName) + 1;
  const originDates = sheet.getRange(2, originColIndex, lastRow - 1).getValues().flat();

シートから最終行数を取得し、1行目のヘッダー情報を取得します。

その後、ヘッダーから元になる列名のインデックスを検索し、元になる列のデータを取得します。

getLastRow()は下記リンクを確認.

GAS
  let outputData = [];
  
  for (const dateString of originDates) {
    if (dateString) {
      // ...
      const rowData = [...];
      outputData.push(rowData);
    } else {
      outputData.push(Array(targetColNames.length).fill(''));
    }
  }

outputData という空の配列を宣言し、元になる列のデータに対してループ処理を行います。

各行のデータが空でない場合は、必要な情報を計算して rowData 配列に格納し、outputData 配列に追加します。

データが空の場合は、空の値を持つ配列を outputData に追加します。

GAS
  const targetColIndexes = targetColNames.map(name => headers.indexOf(name) + 1);
  for (let i = 0; i < targetColNames.length; i++) {
    const colData = outputData.map(row => [row[i]]);
    sheet.getRange(2, targetColIndexes[i], colData.length).setValues(colData);
  }

対象の列名のインデックスを計算し、対象の列にデータを書き込むためのループ処理を行います。

outputData 配列から各列のデータを取り出し、スプレッドシートにセットします。

sheet.getRange() 関数を使ってデータを書き込むべき範囲を指定し、setValues() 関数でデータを書き込みます。

sheet.getRange() は下記リンクを参照。

GAS
  Logger.log('スプレッドシートへのデータ更新が完了しました。');
}

スプレッドシートへのデータ更新が完了したことを示すメッセージをログに出力します。

これで処理が完了し、関数の実行が終了します。

このコード全体では、与えられたスプレッドシートのURLとシート名を使って、元になる列名から対象の列名に必要なデータを計算して書き込む処理を行っています

まとめ

この記事では、Google Apps Script (GAS) を使用してスプレッドシート上の日付データをもとに、効率的な週報・月報作成方法を学びました

記事の内容を活用することで、データ集計やレポート作成の手間を大幅に削減し、業務の効率化につなげることができます。

読者の皆さんは、この記事を参考に、以下のアクションを検討してみてください。

  1. 自身のスプレッドシートにコードを実装し、効率化を試みる。
  2. 他の業務で活用できるGASの応用方法を調査し、スキルを向上させる。
  3. 同僚や上司にこの効率化方法を共有し、チーム全体の生産性向上に貢献する。

記事で学んだことをを活用して、スプレッドシートを使いこなし、業務効率化に繋げましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です