尝试将 startDate 和 endDate 从 spreadsheet1 标记为 spreadsheet2

Trying to mark startDate and endDate from spreadsheet1 to spreadsheet2

我有电子表格 1,其中包含此图片中的所有详细信息 (Spreadsheet1), there are columns with startDate and endDate with some dates. Now i have a different spreadsheet2 like in this image (spreadsheet2),其中包含一年中所有日期的 header 行(从 01/01/2021 到 31/12/2021 ).现在 spreadsheet1 中的 startDate 和 endDate 应该与 spreadsheet2 中的 header 相匹配,并将 spreadsheet1 中 Type 列的值放入 spreadsheet2 中的相应单元格(就像它存在于 spreadsheet2 图像中一样以供参考)。下面是我正在使用的代码,但我没有达到我的目标。请帮助我,我是编码世界的新手。谢谢。

function myFunction() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getActiveSheet();
  let last_row = sheet.getLastRow();
  let data = sheet.getRange("A2:E"+last_row).getValues();

  let start_date = [];
  let end_date = [];
  let dates_between = [];
  let id = [];
  let name = [];
  let message = [];

  let dd = SpreadsheetApp.openById('1z5WB1sACp1zvgfyXDbAmYxklSZOMIC8kNi_3Yci-PkM');
  let dsheet = dd.getActiveSheet();
  let dlast_row = dsheet.getLastRow();
  let ddata = dsheet.getRange('C2:NC'+dlast_row).getValues();
  let did = dsheet.getRange('A2:A'+last_row);

  for(let i = 0; i<data.length;i++){
    // let id = data[i][0];
    id.push(data[i][0]);
    name.push(data[i][1]);
    start_date.push(data[i][2]);
    end_date.push(data[i][3]);
    message.push(data[i][4]);
    dates_between.push(DATES_BETWEEN(start_date[i], end_date[i]));
  }

  did.setValue(id);
  
}
function DATES_BETWEEN(dateFrom, dateTo) {
  var t = dateFrom.getTime(),
      tMax = dateTo.getTime(),
      values = [];
  while (t <= tMax) {
    values.push(new Date(t));
    t += 24000 * 3600;
  }
  return values;
}

如果您能够将 'types' 放在开始日期和结束日期的行中,您可以使用 Array.fill() 方法填补中间的空白。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill

您只需将行作为数组获取并将其放回 sheet。您甚至不需要计算间隙中的日期。您只需在填充的开始和结束单元格之间填充所有这些空元素。

这是你的row/array:['','','x','','','x','','']

起始单元格是 array.indexOf('x')

结束单元格是 array.lastIndexOf('x')

要用 'x' 字符串填补空白,请使用 array.fill('x', start, end)

您将获得:['','','x','x','x','x','','']


下面是我不使用日期的解决方案。如果您的日期在两个 sheet 上具有相同的格式,并且如果您的目标 sheet 始终具有源 sheet 行的日期,您可以将它们视为字符串,并将它们用作一个对象的键(在我的例子中是一张地图):

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var src_sheet = ss.getSheetByName('Sheet1');
  var dest_sheet = ss.getSheetByName('Sheet2');

  // get dates from first row of destination sheet
  var dates = dest_sheet.getDataRange().getDisplayValues()[0].slice(2);
  
  // get rows (without first row) from source sheet
  var rows = src_sheet.getDataRange().getDisplayValues().slice(1);

  // loop through the rows and get the table
  var table = rows.map(row => {
    
    // get variables from the row
    var [id, name, type, start, end] = row.slice(0, 5);

    // create empty Map with dates-keys (date1:'', date2:'', ...)
    var dates_map = new Map(dates.map(date => [date, '']));
  
    // assign 'type' to key['start date'] and to key['end date']
    dates_map.set(start, type).set(end, type);

    // create array (row) from values of the Map
    var row_array = Array.from(dates_map.values());

    // fill empty elements of the array between first and last 'type'
    row_array.fill(type, row_array.indexOf(type), row_array.lastIndexOf(type));

    // return row
    return [id, name, ...row_array];
  });

  // set the table on the destination sheet
  dest_sheet.getRange(2, 1, table.length, table[0].length).setValues(table);
}

没有注释的相同代码:

function myFunction() {
  var ss         = SpreadsheetApp.getActiveSpreadsheet();
  var src_sheet  = ss.getSheetByName('Sheet1');
  var dest_sheet = ss.getSheetByName('Sheet2');
  var dates      = dest_sheet.getDataRange().getDisplayValues()[0].slice(2);
  var rows       = src_sheet.getDataRange().getDisplayValues().slice(1);

  var table = rows.map(row => {
    var [id, name, type, start, end] = row;
    var dates_map = new Map(dates.map(date => [date,'']));
    dates_map.set(start, type).set(end, type);
    var row_array = Array.from(dates_map.values());
    row_array.fill(type, row_array.indexOf(type), row_array.lastIndexOf(type));
    return [id, name, ...row_array];
  });

  dest_sheet.getRange(2, 1, table.length, table[0].length).setValues(table);
}

以防万一,这是一个 destructuring assignment:

var [id, name, type, start, end] = row;

意思是:

var id    = row[0];
var name  = row[1];
var type  = row[2];
var start = row[3];
var end   = row[4];

这里是the link to my dummy spreadsheet.