根据同一行中另一个单元格中的日期自动将特定文本插入Google电子表格单元格中的脚本

时间:2019-10-14 14:10:12

标签: google-apps-script google-sheets

我的另一个question中有@ZektorH提供的以下脚本。

import openpyxl 

wb = openpyxl.Workbook()
ws = wb.active

for _ in range(6):
    ws.append(('TEST' for _ in range(4)))

for row in range(4, ws.max_row + 1):
    ws.row_dimensions[row].height = 48

# wb.save(...)

少量修改后,脚本可以正常工作,但是仍然存在一个问题。当您清除一行中 date 单元格(列B)中的值时,脚本将清除该行所有单元格中的所有值。

这对我来说是个问题,因为许多行在function onEdit(e) { if (e.range.getColumn() ==2) { //User edited the date column if (typeof e.range.getValue() === typeof new Date()) { //Value of edit was a date endColumns(e.range.getRow(), e.range.getValue()); } else if (e.range.getValue() === "" || e.range.getValue() === null) { var sheets = SpreadsheetApp.getActiveSheet(); var resetRange = sheets.getRange(e.range.getRow(), e.range.getColumn()+1, 1, sheets.getMaxColumns()-e.range.getColumn()); resetRange.clear({contentsOnly: true}); //Will delete all text, not only the "ENDED" text. } } } function endColumns(rowNum, limitDate) { var sheets = SpreadsheetApp.getActiveSheet(); var colOffset = 3; //Offset to account for your row Headers var dateHeader = sheets.getRange(1, colOffset, 1, sheets.getMaxColumns()-colOffset); var availableDates = dateHeader.getValues()[0]; var foundCol = 0; for (var i=0; i<availableDates.length; i++) { if (availableDates[i]>=limitDate) { break; } foundCol++; } var rewriteCells = sheets.getRange(rowNum, foundCol+colOffset, 1, sheets.getMaxColumns()-(foundCol+colOffset-1)); //Add your formatting and text below: rewriteCells.setValue("ENDED"); //Clear all cells that are "white" (no header) for (var i=0; i<availableDates.length; i++) { if (availableDates[i]==="" || availableDates[i] ===null) { sheets.getRange(rowNum, colOffset+i).clear(); } } } 日期之前的单元格中都有重要数据。

问题

我需要在此脚本中进行哪些更改,以便在清除 date单元格后仅清除带有ENDED文本的单元格?

1 个答案:

答案 0 :(得分:0)

我已经对您的代码进行了一些修改,基本上添加了一个条件来检查每个单元格中的值是否等于“ ENDED”,并且只有在这种情况下才删除数据:

// Delete all "ENDED" values:
var resetRange = sheets.getRange(e.range.getRow(), e.range.getColumn() + 1, 1, sheets.getMaxColumns() - e.range.getColumn());
var resetValues = resetRange.getValues()[0];
for(var i = 0; i < resetValues.length; i++) {
  if(resetValues[i] == "ENDED") {
    var resetCell = sheets.getRange(e.range.getRow(), e.range.getColumn() + 1 + i);
    resetCell.clearContent();
  }
}

此外,如果您编辑到以后的日期,则会删除相应的“ ENDED”值:

// Clear past dates if new date is later:
var beforeDate = sheets.getRange(rowNum, colOffset, 1, foundCol);
var beforeValues = beforeDate.getValues()[0];
for(var i = 0; i < beforeValues.length; i++) {
  if(beforeValues[i] == "ENDED") {
    sheets.getRange(rowNum, colOffset + i).clearContent();
  }  
}

因此,完整的代码如下:

function onEdit(e) {
  if (e.range.getColumn() == 2) {
    //User edited the date column
    if (typeof e.range.getValue() === typeof new Date()) {
      //Value of edit was a date
      endColumns(e.range.getRow(), e.range.getValue());
    } else if (e.range.getValue() === ""  || e.range.getValue() === null) {
      var sheets = SpreadsheetApp.getActiveSheet();
      // Delete all "ENDED" values:
      var resetRange = sheets.getRange(e.range.getRow(), e.range.getColumn() + 1, 1, sheets.getMaxColumns() - e.range.getColumn());
      var resetValues = resetRange.getValues()[0];
      for(var i = 0; i < resetValues.length; i++) {
        if(resetValues[i] == "ENDED") {
          var resetCell = sheets.getRange(e.range.getRow(), e.range.getColumn() + 1 + i);
          resetCell.clearContent();
        }
      }      
    }
  }
}

function endColumns(rowNum, limitDate) {
  var sheets = SpreadsheetApp.getActiveSheet();

  var colOffset = 3; //Offset to account for your row Headers
  var dateHeader = sheets.getRange(1, colOffset, 1, sheets.getMaxColumns() - colOffset);

  var availableDates = dateHeader.getValues()[0];

  var foundCol = 0;
  for (var i = 0; i < availableDates.length; i++) {
    if (availableDates[i] >= limitDate) {
      break;
    }
    foundCol++;
  }

  var rewriteCells = sheets.getRange(rowNum, foundCol + colOffset, 1, sheets.getMaxColumns() - (foundCol + colOffset - 1));

  //Add your formatting and text below:
  rewriteCells.setValue("ENDED");

  // Clear past dates if new date is later:
  var beforeDate = sheets.getRange(rowNum, colOffset, 1, foundCol);
  var beforeValues = beforeDate.getValues()[0];
  for(var i = 0; i < beforeValues.length; i++) {
    if(beforeValues[i] == "ENDED") {
      sheets.getRange(rowNum, colOffset + i).clearContent();
    }  
  }


  // Clear all cells that are "white" (no header)
  for (var i = 0; i < availableDates.length; i++) {
    if (availableDates[i] === "" || availableDates[i] === null) {
      sheets.getRange(rowNum, colOffset+i).clear();
    }
  }
}

我希望这对您有帮助。