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

Google apps script 脚本,根据同一行上另一个单元格中的日期,在Google电子表格的单元格中自动插入特定文本,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有@ZektorH在我的另一本书中提供的以下脚本 函数onEdit(e){ if(e.range.getColumn()==2){ //用户编辑了日期列 if(typeof e.range.getValue()==typeof new Date()){ //编辑的值是一个日期 endColumns(e.range.getRow(),e.range.getValue()); }else if(e.range.getValue()==“”| | e.range.getValue()==null){

我有@ZektorH在我的另一本书中提供的以下脚本

函数onEdit(e){
if(e.range.getColumn()==2){
//用户编辑了日期列
if(typeof e.range.getValue()==typeof new 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});//将删除所有文本,而不仅仅是“结束”文本。
}
}
}
函数endColumns(rowNum、limitDate){
var sheets=SpreadsheetApp.getActiveSheet();
var colOffset=3;//行标题的偏移量
var dateHeader=sheets.getRange(1,colOffset,1,sheets.getMaxColumns()-colOffset);
var availableDates=dateHeader.getValues()[0];
var=0;
对于(变量i=0;i=limitDate){
打破
}
foundCol++;
}
var rewriteCells=sheets.getRange(rowNum,foundCol+colOffset,1,sheets.getMaxColumns()-(foundCol+colOffset-1));
//在下面添加格式和文本:
重写单元格。设置值(“结束”);
//清除所有“白色”(无标题)的单元格

对于(var i=0;i我对您的代码做了一些修改,基本上添加了一个条件来检查每个单元格中的值是否等于“end”,并且只有在这种情况下才删除数据:

// 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();
  }
}
//删除所有“结束”值:
var resetRange=sheets.getRange(e.range.getRow(),e.range.getColumn()+1,1,sheets.getMaxColumns()-e.range.getColumn());
var resetValues=resetRange.getValues()[0];
对于(变量i=0;i
此外,如果编辑到以后的日期,将删除相应的“结束”值:

// 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();
  }  
}
//如果新日期更晚,则清除过去的日期:
var beforeDate=sheets.getRange(rowNum,colOffset,1,foundCol);
var beforeValues=beforeDate.getValues()[0];
对于(变量i=0;i
因此,完整代码如下所示:

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();
    }
  }
}
函数onEdit(e){
if(e.range.getColumn()==2){
//用户编辑了日期列
if(typeof e.range.getValue()==typeof new 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());
var resetValues=resetRange.getValues()[0];
对于(变量i=0;i=limitDate){
打破
}
foundCol++;
}
var rewriteCells=sheets.getRange(rowNum,foundCol+colOffset,1,sheets.getMaxColumns()-(foundCol+colOffset-1));
//在下面添加格式和文本:
重写单元格。设置值(“结束”);
//如果新日期更晚,则清除过去的日期:
var beforeDate=sheets.getRange(rowNum,colOffset,1,foundCol);
var beforeValues=beforeDate.getValues()[0];
对于(变量i=0;i

我希望这能对您有所帮助。

您检查过availableDates内容吗?如果您想检查带有“结束”文本的列,只需像检查availableDates一样对其进行迭代即可。嘿@Juan Bravo Roig…谢谢您的回答。我该怎么做?我不知道如何进行您提到的检查。到目前为止我所做的一切努力(主要是尝试和错误)是为了找到一种方法来检查哪些单元格包含结束的文本,然后将其清除。我已经更新了答案!非常感谢@Omila…这正是我所寻找的,有了你的解释,我终于(!)了解了它是如何完成的!!!。再次感谢,非常感谢您的帮助。顺便问一下,作为奖励,是否有一种简单的方法通过脚本锁定/保护标记的单元格区域,并在它们清除时解锁它们?…或者使用谷歌的保护范围功能更容易做到这一点?非常欢迎。是的,您可以使用Apps script.Ch轻松做到这一点更多信息,请勾选此项:。如果您有问题,我建议您创建另一个问题。我放弃!我做不到!新问题。
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();
    }
  }
}