Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 脚本,用于格式化一系列单元格,并根据Google电子表格中的日期插入特定文本_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 脚本,用于格式化一系列单元格,并根据Google电子表格中的日期插入特定文本

Google apps script 脚本,用于格式化一系列单元格,并根据Google电子表格中的日期插入特定文本,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个计划者式的谷歌电子表格,每天有8-10个用户添加数据。当我向单元格中添加日期时,我希望对该日期之后同一行中的所有单元格进行格式化,并添加一个类似“ENDED”的文本值 目前,我正在使用条件格式和ArrayFormula来添加文本值。问题是,要使ArrayFormula工作,单元格必须为空,在我的工作表中,单元格可能包含“结束”日期单元格之前的数据 有没有办法用脚本来实现这一点?。。。。如果脚本也能处理单元格的格式,那将是最好的解决方案 这是我的示例文件,以更好地理解我正在尝试做什么 您可

我有一个计划者式的谷歌电子表格,每天有8-10个用户添加数据。当我向单元格中添加日期时,我希望对该日期之后同一行中的所有单元格进行格式化,并添加一个类似“ENDED”的文本值

目前,我正在使用条件格式和ArrayFormula来添加文本值。问题是,要使ArrayFormula工作,单元格必须为空,在我的工作表中,单元格可能包含“结束”日期单元格之前的数据

有没有办法用脚本来实现这一点?。。。。如果脚本也能处理单元格的格式,那将是最好的解决方案

这是我的示例文件,以更好地理解我正在尝试做什么


您可以使用触发器和自定义函数来完成此操作

创建新的应用程序脚本项目并使用以下代码:

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(); //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));

  //Add your formatting and text below:
  rewriteCells.setValue("Ended");
  rewriteCells.setBackground("red");
  rewriteCells.setFontColor("yellow");

  //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());
resetRange.clear();//将删除所有文本,而不仅仅是“结束”文本。
}
}
}
函数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));
//在下面添加格式和文本:
重写单元格。设置值(“结束”);
3.挫折背景(“红色”);
重写单元格。setFontColor(“黄色”);
//清除所有“白色”(无标题)的单元格

对于(var i=0;你能提供你期望的结果吗?@Tanaike查看链接并更改B列第3行中的日期,你就会看到OP在说什么。@Cooper感谢你的回复。当我看到共享电子表格时,我已经能够理解它了。但不幸的是,即使在这种情况下,我也无法理解dOP目标的详细信息。但我想我会支持实现它。所以我问了这个问题。这是因为我理解力差。对此我深表歉意。对于对此感兴趣的任何人。非常感谢你的回答ZektorH。如果这意味着我需要编辑每行和每行脚本的硬编码值日期,不幸的是,这对我来说不合适。在我上面的电子表格示例中,只有3行,这样我就可以演示我要做的事情,但在我的实际工作文件中,有几十行,大约10-12页。正如我之前所说,目前我正在使用一个数组公式,将公式复制并粘贴到每个过期日期,我很高兴g通过脚本避免这种情况。无论如何,再次感谢您的回答。Hello@NessusB,硬编码值仅引用您的日期所在行(第1行)和手动填写日期的列(第B列)。这个解决方案应该适用于您的工作表,因为我自己已经用它的副本进行了测试。希望这能有所帮助!嘿@ZektorH。我非常抱歉没有理解您的答案。您是对的。您的代码工作得非常好,这正是我所寻找的。只有一个缺点。正如您在我的示例文件中看到的,我有一个空列需要separa每个星期都有一个新的文本,脚本也会填充这些列中的单元格。我们可以避免吗?除了插入的文本(结束)我还可以格式化单元格吗?例如,文本和背景的颜色不同,因此也可以去掉条件格式化?再次感谢您的帮助。编辑。对不起,我忘记了这一点…当我从B列删除日期时,是否也可以清除所有标记和格式化的单元格?我注意到,当前如果我删除日期,则会删除标记的单元格插入的文本保留在那里,我必须手动删除它们。@是的,可以这样做。但您可能会遇到删除注释的问题,而不仅仅是删除结束的字段。无论如何,您可以看到如何执行此操作