【问题标题】:How To Shorten a List of OR || Operators in an Google Apps Script如何缩短 OR 列表 || Google Apps 脚本中的运算符
【发布时间】:2022-01-25 16:19:56
【问题描述】:

我正在尝试从ziganotschka 自定义以下 GAS 脚本,以便在触发事件(在单元格中手动输入值)时为工作表的所有列添加背景颜色。

我想过使用数组而不是多个 || OR 语句,但我不知道该怎么做。

ziganotschka 脚本(带有我自定义的多个 || OR 语句):

function onEdit(e) {
  var c = e.range.getColumn();
  if(c == 1 || c == 2){
    var text = e.value;
    var sheet = SpreadsheetApp.getActive().getActiveSheet();
    var range = sheet.getRange(1,1,sheet.getLastRow(),2);
    var values = range.getValues();
    var array = [];
    var row = e.range.getRow();
    for (var i =0; i <values.length; i++){
      if(row!=(i+1))
      {
        array.push(values[i][0]);
      }
    }
    if(array.indexOf(text)==-1){
      var backgrounds = range.getBackgrounds();
      var color = getRandomColor();
      while(backgrounds.indexOf(color)>-1){
        color = getRandomColor();
      }
      buildConditionalFormatting(text, color)
    }
  } 
}

function getRandomColor() {
  var letters = '0123456789abcdef';
  var color = '#';
  for (var i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}


function buildConditionalFormatting(text, color){
  var sheet = SpreadsheetApp.getActiveSheet();
  var formattingRange = sheet.getRange("A:B");
  var rule = SpreadsheetApp.newConditionalFormatRule()
  .whenTextEqualTo(text)
  .setBackground(color)
  .setRanges([formattingRange])
  .build();
  var rules = sheet.getConditionalFormatRules();
  rules.push(rule);
  sheet.setConditionalFormatRules(rules);

}

简而言之,我的请求是,如何从下面的allColumns 数组中获取任何索引(???)以用作下面的 if 语句中的列号?

function onEdit(e) {
  const allColumns = [1, 2];
  var c = e.range.getColumn();
  if(c == ??? ){

我的目标是找到一种避免使用多个 || 的方法。每列的 OR 语句(可能是不定数量的列,取决于触发器,甚至涉及在任何单元格中输入文本)。

我已经搜索了一种使用数组代替 || 的方法。 OR 语句,到目前为止我已经从这篇文章How to Easily Shorten Long Lists of OR(||) Operators in Your Code 中找到了 array.includes() 方法。

但我的代码不起作用,这是我尝试过的:

function onEdit(e) {
  const allColumns = [1, 2];
  var c = e.range.getColumn();
  if(c == allColumns.includes(e)){

我也考虑过Getting a random value from a JavaScript arrayHow to create an array containing 1...N。但也无济于事。

我的代码:

function onEdit(e) {
  const allColumns = [1, 2];
  const random = Math.floor(Math.random() * allColumns.length);
  var c = e.range.getColumn();
  if(c == random ){

我的代码:

function onEdit(e) {
  const allColumns = _.range(1, 2);
  const random = Math.floor(Math.random() * allColumns.length);
  var c = e.range.getColumn();
  if(c == random ){

sample Sheet

【问题讨论】:

    标签: arrays if-statement google-apps-script operators


    【解决方案1】:

    e 是事件对象{}various properties

    c 是列号。

    if(c == allColumns.includes(e)){ 不正确。该脚本要求检查allColumns 是否包含对象e。这将始终返回false。正确的语法是:

    if(allColumns.includes(c)){
    

    练习Array.includes

    【讨论】:

    • 效果很好,谢谢!我没有尝试的一件事:)。我现在会尝试了解它为什么会起作用,稍后会回来。身体健康!
    • 啊。我想我现在明白了。我的错误if(c == allColumns.includes(e)){ 意味着我试图知道整个数组是否包含在列中。但是对于您的解决方案if(allColumns.includes(c)){,这意味着相反:如果(整个)列包含在数组中(作为数组的单个元素,而不是整个数组)? include() 的参数(本例中为“c”)是数组索引?这相当于询问 c 列(任何列)是否是数组的索引?您分享的参考帮助很大,谢谢!我很难使用 GetColumn()。
    • @Lod e 是一个事件对象。它包含debug_e in this answer 中列出的所有对象。 allColumns.includes(e) 类似于调用 allColumns.includes({range:{},value:''})includes 与索引无关。它只是检查数组的任何值是否等于传递的参数。 c 将是数字列,如 1。这就像调用 [1,2].includes(1) 多练习就会得到它。
    • 感谢您的帮助!接下来我将更多地练习数组。身体健康!
    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    相关资源
    最近更新 更多