【GAS】生年月日のデータをシリアル値やテキスト形式から日時データに整形する

スプレッドシートに外部から日付データを入力するとき、38575みたいなシリアル値がたまに入力されたり、テキスト形式で入力されるとカスタム日時のフォーマットが適用されないので、下記コードで日時データに変換してみました。

L列に日付が入ってるものとします。

// 生年月日をテキスト形式からDateに変換
function updateStudentBirthday(){ let ss = SpreadsheetApp.getActiveSpreadsheet(); const datash = ss.getSheetByName('master'); const lastRow = datash.getLastRow(); const data = datash.getRange('L:L').getValues(); // console.log(data); let line_number = 1; data.forEach((line)=>{ const d = line[0]; if(d!==""){ const type = typeof d; // console.log(d,type); // console.log(d.indexOf('/')) let date = ''; if(type=='string' && line_number!==1){ if(d.indexOf('/')!==-1){ const time = Date.parse(d); date = new Date(time); // console.log(d,date,type); }else{ date = dateFromSn(d); } }else if(type=='number'){ date = dateFromSn(d); } // console.log(date) if(date!='') datash.getRange("L"+line_number).setValue(date); } line_number++; });
}
function dateFromSn(serialNumber){ // シリアル値→UNIX時間(ミリ秒) var COEFFICIENT = 24 * 60 * 60 * 1000; //日数とミリ秒を変換する係数 var DATES_OFFSET = 70 * 365 + 17 + 1 + 1; //「1900/1/0」~「1970/1/1」 (日数) var MILLIS_DIFFERENCE = 9 * 60 * 60 * 1000; //UTCとJSTの時差 (ミリ秒) const ut = (serialNumber - DATES_OFFSET) * COEFFICIENT - MILLIS_DIFFERENCE; return new Date(ut);
}

下記の郵便番号と電話番号の整形も参考にしてみてください。