0

我刚开始在 Google Docs 上探索这些电子表格脚本。我想编写一个脚本来查找项目之间的日期重叠(将给定单元格的 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')}
  }
4

2 回答 2

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);
  }
}
于 2013-10-17T03:48:38.487 回答
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);
    }
}
于 2013-12-25T06:00:27.000 回答