具有多种功能的JS代码在编辑时应用于单元

时间:2019-05-30 19:18:59

标签: javascript google-sheets appscript

我目前正在尝试在Google工作表的脚本编辑器中编写一些JS,以不仅产生与单击复选框相关联的时间戳,还设置一个计时器,如果该复选框被选中的时间超过X分钟,则该单元格将开始变成红色。

此外,当我取消选中该框以使单元格变为绿色时。这背后的想法是当我单击表示表已满时间戳的框时想到的餐厅女主人范式,这给了我检查框的时间,并且颜色显示了该框不可用的时间-如果我取消选择框,它给出了未选中的时间戳,同时重置计时器并将单元格变回绿色。目前,我可以使时间戳部分与我编写的代码一起使用,并且可以在第一次编辑时更改颜色,但是根据复选框

,它不会在颜色之间产生波动

下面是我当前拥有的代码。会使用触发器功能还是其他on编辑功能如果有人有任何提示或想法,将不胜感激

  • 从视觉上来说,我要引用的每一列都是停滞列1,它是座位号,第二列和第三列分别位于下面的复选框中,该复选框在什么时候被选中和未选中
    const moviesToMap = this.state.movies;
    moviesToMap.map(movie => {
      return this.state.title === movie.title
        ? movie.characters.map(person => {
            const actorUrl = person;
            const actorId = parseInt(actorUrl.slice(31, -1));
            let peopleStateCopy = this.state.people;
            peopleStateCopy.map(persona => {
              const slugState = persona.url;
              const slugId = parseInt(slugState.slice(31, -1));
              if (slugId === actorId) {
                actors.push(persona);
                return persona.name;
              }
            });
          })

1 个答案:

答案 0 :(得分:0)

下面的代码应该可以工作:

function onEdit(e) {

  var s = SpreadsheetApp.getActiveSheet(); // the active sheet (no need to check if the sheet == sheet1 as the active sheet will always be the one that's being edited)
  var r = e.range; // the range of the edited cell
  var c = r.getColumn(); // the column of the range
  var timeDelay = 5; // number in seconds
  var checkbox = r.getValue(); // the value of the checkbox after being edited
  var date = new Date(); // the date for the timestamp

  if (c == 5 && checkbox == true) { // if the checkbox has been checked, change the color to red
    var nextCell = r.offset(0,1);
    Utilities.sleep(timeDelay * 1000); // Utilities.sleep takes a number in milliseconds
    nextCell.setValue(date).setBackground("red");
  } else if (c == 5 && checkbox == false) { // if the checkbox has been unchecked, change the color to green
    var nextCell = r.offset(0,1);
    nextCell.setValue(date).setBackground("green");
  }
}

我对您进行了一些更改,如果您要向代码中添加更多内容(例如,提前声明日期,在开始等)。

但是,这肯定是多余的,因为活动表仍会返回正确的内容:

 if (s.getName() == "Sheet1")

我也将setFontColor()更改为setBackground(),因为听起来这是您希望从描述中获得的,并且认为您可能不知道该函数,尽管您当然可以将其改回setFontColor()而不出现任何问题。

我也添加了您询问的时间延迟,尽管我不确定为什么您会在这种情况下需要它。如果这不是您要谈论的内容,请随时删除这两行,其余代码仍然可以正常工作:

var timeDelay = 5; // number in seconds

   Utilities.sleep(timeDelay * 1000);