我刚开始在Google文档上探索这些电子表格脚本。我想编写一个脚本来查找项目之间的日期重叠(将给定单元格的bg颜色更改为红色)并创建一个新列,显示该项目类型的冲突数。如果你能提供一些例子或方法,我将非常感激。
这是我的数据集。
我试过的是这个。这仅适用于第一列。
function formatting() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); // get the sheet
var columnF = sheet.getRange(1, 6, sheet.getLastRow(), 1).setBackgroundColor('white'); // get all the rows and clear colors
var columnG = sheet.getRange(1, 7, sheet.getLastRow(), 1).setBackgroundColor('white'); // get all the rows and clear colors
var fValues = columnF.getValues(); // get the values
var gValues = columnG.getValues();
var day = 24*3600*1000
Logger.log(gValues)
var startDay1 = parseInt(fValues[0][0].getTime()/day)
var endDay1 = parseInt(gValues[0][0].getTime()/day)
var startDay2 = parseInt(fValues[1][0].getTime()/day)
var endDay2 = parseInt(gValues[1][0].getTime()/day)
if (startDay1<endDay2 && startDay2<endDay1) {sheet.getRange(1, 6, 1, 1).setBackgroundColor('red')}
else {sheet.getRange(1, 6, 1, 1).setBackgroundColor('green')}
}
答案 0 :(得分:1)
遍历每一行所需的代码。不知道你想如何与最后一个项目竞争,因为没有比较它的日期。
将项目标记为红色的简单方法是创建一个javascript对象(项目),并存储每个项目及其计数。以下是有关javascript对象的一些文档:Javascript.info - Objects
function formatting() {
try{
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); // get the sheet
// Going to need the column for project type
var projects = {};
var eValues = sheet.getRange(1, 5, sheet.getLastRow(), 1).getValues();
var columnF = sheet.getRange(1, 6, sheet.getLastRow(), 1).setBackgroundColor('white'); // get all the rows and clear colors
var columnG = sheet.getRange(1, 7, sheet.getLastRow(), 1).setBackgroundColor('white'); // get all the rows and clear colors
var fValues = columnF.getValues(); // get the values
var gValues = columnG.getValues();
var day = 24*3600*1000
Logger.log(gValues)
// loop through all the rows in the dataset
for(var r = 0; r < (fValues.length - 1); r++){
var startDay1 = parseInt(fValues[r][0].getTime()/day);
var endDay1 = parseInt(gValues[r][0].getTime()/day);
var startDay2 = parseInt(fValues[(r+1)][0].getTime()/day);
var endDay2 = parseInt(gValues[(r+1)][0].getTime()/day);
if (startDay1<endDay2 && startDay2<endDay1) {
sheet.getRange((r+1), 6, 1, 1).setBackgroundColor('red');
var projectName = eValues[r][0];
if(projects[projectName] !== undefined) { // strict(!) comparison
// add one to this projects count
projects[projectName] += 1;
}else{
// create the first count for this project
projects[projectName] = 1;
}
}
else {
sheet.getRange((r+1), 6, 1, 1).setBackgroundColor('green');
}
}
// updating is done, need to create the counts
// shove the results in column L
var rowCount = 1;
for(var key in projects) {
var val = projects[key];
sheet.getRange(rowCount, 12, 1, 1).setValue(key+": "+val);
rowCount += 1;
}
}catch(e){
Logger.log(e.lineNumber + ' - ' + e);
}
}
答案 1 :(得分:0)
以下是有兴趣的人的答案。
function formatting(m, d) {
try {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); // get the sheet
var output = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2'); // output sheet
output.clear()
// Going to need the column for project type
var counts = {};
var eValues = sheet.getRange(1, 3, sheet.getLastRow(), 1).getValues();
var columnF = sheet.getRange(1, 1, sheet.getLastRow(), 1).setBackgroundColor('white'); // get all the rows and clear colors
var columnG = sheet.getRange(1, 2, sheet.getLastRow(), 1).setBackgroundColor('white'); // get all the rows and clear colors
var columnD = sheet.getRange(1, 4, sheet.getLastRow(), 1).setBackgroundColor('white').clearContent(); // get all the rows and clear colors
var columnCritical = sheet.getRange(1, 7, sheet.getLastRow(), 1).setBackgroundColor('white').clearContent(); // get all the rows and clear colors
var fValues = columnF.getValues(); // get the values
var gValues = columnG.getValues();
var day = 24 * 3600 * 1000
// loop through all the rows in the dataset
for (var r = 0; r < (fValues.length - 1); r++) {
var startDay1 = parseInt(fValues[r][0].getTime() / day);
var endDay1 = parseInt(gValues[r][0].getTime() / day);
// loop through all the rows for given date
for (var z = 0; z < (fValues.length - 1); z++) {
var startDay2 = parseInt(fValues[(z)][0].getTime() / day);
var endDay2 = parseInt(gValues[(z)][0].getTime() / day);
// if the date is the same go to the next one
if (startDay1 == startDay2 && endDay2 == endDay1) continue;
// check for conflicts
else if (startDay1 < endDay2 && startDay2 < endDay1) {
//Here is our conflict!!!;
var projectn = r + 1
if (counts[projectn] !== undefined) { // strict(!) comparison
// add one to this projects count
counts[projectn] += 1;
} else {
// create the first count for this project
counts[projectn] = 1;
}
} else {
// if there is no conflict
}
} //end of for loop for var z
// change the background of the counts to red and set values
if (counts[r + 1] == undefined) {
sheet.getRange(r + 1, 4, 1, 1).setValue(counts[r + 1]).setBackground('green');
} else {
sheet.getRange(r + 1, 4, 1, 1).setValue(counts[r + 1]).setBackground('red');
}
} // end of for loop for var r
// show if there is any errors
} catch (e) {
Logger.log(e.lineNumber + ' - ' + e);
}
}