下記は、請求管理表シート:ヘッダを除く実データが3行目から、請求情報データ:ヘッダを除いて2行目から始まる前提です。
function getYearMonth(date) {
// dateが日付型ならば「yyyy年M月」という文字列に変換。
const typestr = Object.prototype.toString.call(date);
if (typestr === '[object Date]') {
return Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy年M月');
}
// dateが文字列型かつ「yyyy/M/d」という形式ならば、「yyyy年M月」という文字列に変換
if (typestr === '[object String]') {
const s = date.split('/');
if (s.length > 1) return `${s[0]}年${Number(s[1])}月`;
}
// いずれにも該当しない場合はdateをそのまま返す。
return date;
}
function searchColumn(header, value){
// headerの中にvalueに該当する年月があればその列番号を返す。なければ-1を返す。
for (let idx = 0; idx < header.length; idx++){
if( getYearMonth(header[idx]) === getYearMonth(value)) return idx + 1;
}
return -1;
}
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const shChargeData = ss.getSheetByName('請求情報データ');
const shChargeTable = ss.getSheetByName('請求管理表');
const dataRecords = shChargeData.getRange(2, 1, shChargeData.getLastRow()-1, 7).getValues();
const tableRecords = shChargeTable.getRange(3, 1, shChargeTable.getLastRow()-2, 20).getValues();
// 請求管理表のヘッダ(2行目)
const tableHeader = shChargeTable.getRange(2, 1, 1, 20).getValues()[0];
// 請求管理表の請求月の列番号(1 origin)
let targetColumn = -1;
for (let i=0; i<tableRecords.length; i++) {
const tableRow = tableRecords[i]
let found = false;
for (const dataRow of dataRecords) {
// 請求管理表のヘッダから、該当する月の列を探す。
// 「作成日時の値は全て同じ」なので、一度取得すれば以後探す必要なし。
if (targetColumn === -1) {
targetColumn = searchColumn(tableHeader, dataRow[6]);
// 該当する年月が見つからなかった場合はスキップ
if (targetColumn === -1) {
found = true;
break;
}
}
// 一致するIDが存在した場合は請求金額を転記
if (dataRow[0] === tableRow[0]) {
found = true;
shChargeTable.getRange(i+3, targetColumn, 1, 1).setValue(dataRow[5]);
break;
}
}
// 請求管理表に一致するIDがない場合は「¥0」を転記
if (!found) {
shChargeTable.getRange(i+3, targetColumn, 1, 1).setValue('¥0');
}
}
}