見出し画像

【GAS】Google Apps Script 活用事例 週番号をサクッと取得!SpreadsheetやLooker Studioの集計をもっと便利に!!

採用実務に携わっている方なら、きっと経験があるのではないでしょうか?応募日やスカウト送付日などのデータは日々蓄積されていくのに、SpreadsheetやLooker Studioでは週次で集計できない…なんてことが。
ちなみにMicrosoft Excelだとデフォルトで週次で分析できるみたいです…..。

そこで今回は、週番号を求める関数と、週番号から該当する日付を取得する関数を書いてみました。
例えば、「今週は何週目?」や「48週目はいつからいつまで?」といった情報が、パッとわからない…なんて経験、きっとあるはず。

メインのスクリプト

function test(){
  const date = new Date();
  const date2 = '2024/11/30';
  getWeekNumber(date);
  console.log('------------------');

  const weekNumber = getWeekNumber(date2);
  console.log(convertWeekNumberToStrDate(weekNumber));
}



/**
 * 指定した日付が属する週番号を取得します。
 *
 * @param {Date|string} date - 週番号を取得したい日付。Dateオブジェクトまたはyyyy/MM/dd形式の文字列。
 * @return {number} 指定した日付が属する週番号(年初からの週数)を返します。
 */
function getWeekNumber(date) {
  console.log(`引数の型: ${typeof date}`);
  let targetDate;

  try {
    if (typeof date === 'string' && /^\d{4}\/\d{2}\/\d{2}$/.test(date)) {
      console.log(`引数で受け取った文字列:${date} typeOf: ${typeof date}`);
      const [year, month, day] = date.split('/');
      targetDate = new Date(year, month - 1, day);

    } else if (date instanceof Date && !isNaN(date)) {
      targetDate = date; // Dateオブジェクトをコピー

    }
  } catch (error) {
    throw new Error('入力は有効な yyyy/MM/dd形式の文字列か、Dateオブジェクトである必要があります。');

  }

  console.log(`targetDate: ${targetDate}`);
  const year = targetDate.getFullYear();
  
  const startDate = new Date(year, 0, 1);
  const dayOfYear = Math.floor((targetDate - startDate + (24 * 60 * 60 * 1000)) / (24 * 60 * 60 * 1000));
  const weekNumber = Math.ceil((dayOfYear + startDate.getDay()) / 7);
  console.log(`weekNumber: ${weekNumber}`);

  return weekNumber;
}



/**
 * 指定された週番号に対応する日付を文字列で返します。
 *
 * @param {number} targetWeekNumber - 対象の週番号(1から始まる)。
 * @return {string} 週番号に対応する日付の文字列(yyyy/MM/dd形式)。
 *
 */
function convertWeekNumberToStrDate(targetWeekNumber) {
  // 年の初日を取得(例:2024/01/01)
  const currentYear = new Date().getFullYear();
  const firstDayOfYear = new Date(currentYear, 0, 1);
  const firstDayOfWeek = firstDayOfYear.getDay(); 
  const offsetDays = firstDayOfWeek === 0 ? 0 : firstDayOfWeek;

  // 指定週数から開始日を計算
  const firstWeekStartDate = new Date(currentYear, 0, 1 - offsetDays);

  // 1週目を除外するため、1を引く
  const daysToAdd = (targetWeekNumber -1) * 7;
  firstWeekStartDate.setDate(firstWeekStartDate.getDate() + daysToAdd);

  // 計算結果を出力
  const targetDateStr = Utilities.formatDate(firstWeekStartDate, 'JST', 'yyyy/MM/dd');
  console.log(`${targetWeekNumber}週目: ${targetDateStr}`);

  return targetDateStr

}
週番号と、n週目が何日から始まるのかが分かります。
48週目が11/24(日)から始まることが分かります。

onEdit関数と併用するとさらに便利

onEditは、Google Spreadsheetに値の入力を受け取って処理ができる関数です。入力したユーザーのEmailアドレスを受け取って、現在時刻を取得して自動補完するなんてこともできます。

function onEdit(e) {
  // 編集されたシートを取得
  const sheet = e.range.getSheet();

  // アクティブセルの情報を取得
  const activeCell = getActiveCell(sheet);
  
  // 入力した人のEmailアドレスを取得
 const email = Session.getActiveUser().getEmail();

  // 取得した情報をログに出力
  console.log(activeCell); 
}

/**
 * シートオブジェクトを引数にアクティブなセルの値、行、列などの情報を取得する
 * 
 * @param  {SpreadsheetApp.Sheet} sheet - シートオブジェクト
 * @return {Object.<number|string>}
 */
function getActiveCell(sheet){

  console.info(`getActiveCell()を実行中`);

  const activeCell   = sheet.getActiveCell();
  const activeDetail = {
    sheetName: activeCell.getSheet().getName(),
    row:        activeCell.getRow(),
    column:     activeCell.getColumn(),
    value:      activeCell.getValue(),
    range:      activeCell.getA1Notation()
  }

  console.log(activeDetail);
  return activeDetail
}

Emailを受け取って、名前を返す関数

function getLastName(email) {
  switch (email) {
    case 'nobita@sample.co.jp':
      return 'のび太';
    case 'suneo@sample.co.jp':
      return 'スネ夫';
    default:
      return '不明';
  }
}

過去記事


いいなと思ったら応援しよう!