尝试将 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];
我有电子表格 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];