
【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
}


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 '不明';
}
}