条件边界故障排除

问题描述 投票:0回答:1

我有一个数据集,其中包含 5 或 7 行块中的四种不同处理类型。我想在每个治疗集之间添加边框,所以我尝试修改 Tedinoz 的代码。问题是此代码仅向唯一值添加边框,而我想在该值与前一行不同时添加边框。如何修改 if 语句

if (Treatments.indexOf(row) == -1)
以搜索“Treatment”值与上一行不同的行?

这是完整的代码:

function lineBetween() {

    //setup spreadsheet
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Sheet1");

    // get key variables
    var LastRow = 417
    var LastColumn = sheet.getLastColumn();
    var NumColumns = 8;

    // allow for headers
    var headerRows = 1;

    //erase any current formatting 
    var ClearRange = sheet.getRange(1, 1, LastRow, NumColumns).setBorder(false, false, false, false, false, false); // clear all formatting

    // get the data
    var data = sheet.getRange((+1 + headerRows), 1, (LastRow - headerRows), LastColumn).getValues();

    // setup new array  
    var Treatments = new Array();

    // Loop through treatments(Column C)
    for (var i in data) {

        var row = data[i][2].toString();
        // Logger.log("Inside LOOP: i = "+i+", value = "+ row);// DEBUG

        // search for unqiue values
        if (Treatments.indexOf(row) == -1) { // if value =-1, then the variable is unique

            // Logger.log("Inside IF#1: i = "+i+", "+row+" is not referenced. Adding it");//DEBUG
            // underline the previous row

            if (i != 0) {
                // This IF statement to avoid underlining the Header row
                var range = sheet.getRange((+i + 1 + headerRows), 1, 1, NumColumns).setBorder(true, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID); // format if true
            }
            // continue to build array
            Treatments.push(row);
        }

    }
    // underline the last row of the treatments column
    var range = sheet.getRange(LastRow, 1, 1, NumColumns).setBorder(null, null, true, null, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM); // format if true
    //Logger.log(Treatments);// DEBUG
}
google-sheets google-apps-script conditional-formatting
1个回答
1
投票

试试这个:

function lineBetween() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName("Sheet1");
  sh.getDataRange().setBorder(false, false, false, false, false, false); // clear all formatting
  let sr = 2;//data start row
  const data = sh.getRange(sr, 1, sh.getLastRow() - sr + 1, sh.getLastColumn()).getValues();
  data.forEach((r, i, arr) => {
    if (i > 0) {
      if (r[2] != arr[i - 1][2]) {
        sh.getRange(i + sr, 1, 1, sh.getLastColumn()).setBorder(true, true, true, true, false, false);
      }
    }
  });
}

实际上我认为这对我来说效果更好:

function lineBetween() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName("Sheet0");
  sh.getDataRange().setBorder(false, false, false, false, false, false); // clear all formatting
  let sr = 2;//data start row
  const data = sh.getRange(sr, 1, sh.getLastRow() - sr + 1, sh.getLastColumn()).getValues();
  let uA = [];
  let dA = [];
  data.forEach((r, i, arr) => {
    if (i > 0) {
      if (r[2] != arr[i - 1][2]) {
        sh.getRange(i + sr, 1, 1, sh.getLastColumn()).setBorder(true, false, false, false, false, false);
      }
    }
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.