【问题标题】:Checking/ Referencing Empty Array Values (Google App Script)检查/引用空数组值(Google App 脚本)
【发布时间】:2015-09-02 01:00:45
【问题描述】:

我有一个 Google 电子表格,它可以为每月的工作旅行做一些简单的单元格引用和数学运算。我有一个函数可以读取 A 列中的值(通过工作表上的 WEEKDAY() 公式获得。如果它是星期六(值 5)或星期日(值 6),它会将整行涂黑。我需要它以某种方式格式化工作日(值 0-4),并且仅当该行中的日期单元格为空白时,将该行重新格式化为标准空白。如何搜索数组(您可以看到我是如何创建它的)并在该数组中找到一个空值?我将复制粘贴数组值的示例日志(注意周期性 [])

function weekendClean() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getActiveSheet()
  var range = sheet.getRange("A3:A33")
  var value = range.getValues()
  var sheetCheckRange = sheet.getRange(2,2)
  var sheetCheck = sheetCheckRange.getValue()
  if (sheetCheck == "Date") {
    for (i = 0; i < value.length; i++) {
      if (value[i] == 5 || value[i] == 6) {
        var row = sheet.getRange((i + 3), 1, 1, 11)
        var cell = sheet.getRange((i + 3), 3)
        row.setBackground("Black")
        row.setBorder(true, null, true, null, null, null)
        //top, left, bottom, right, vertical, horizontal
        cell.setValue("W")
      } if (value[i] == 0 || value[i] == 1 || value[i] == 2 || value[i] == 3 || value[i] == 4) {
        var section1 = sheet.getRange((i+3), 2, 1, 5)
        var section2 = sheet.getRange((i+3), 8, 1, 3)
        section1.setBackground("white")
        section2.setBackground("white")
        section1.setBorder(false, null, false, null, null, false)
        section2.setBorder(false, null, false, null, null, false)
      } 
    }
  }
}

此外,请随时清理该代码并附上解释(尤其是关于工作日要做什么的部分)

[15-09-01 17:54:04:051 PDT] [[1.0], [2.0], [], [4.0], [5.0], [6.0],
[0.0], [1.0], [], [3.0], [4.0], [5.0], [], [], [1.0], [], [3.0],
[4.0], [5.0], [6.0], [0.0], [1.0], [2.0], [3.0], [], [5.0], [6.0],
[0.0], [1.0], [2.0], []]

【问题讨论】:

    标签: javascript arrays google-apps-script google-sheets


    【解决方案1】:

    这就是在您的情况下检索空数组的方式:

    var x = [[1.0], [2.0], [], [4.0], [5.0], [6.0], [0.0], [1.0], [], [3.0], [4.0], [5.0], [], [], [1.0], [], [3.0], [4.0], [5.0], [6.0], [0.0], [1.0], [2.0], [3.0], [], [5.0], [6.0], [0.0], [1.0], [2.0], []];
    
    function myFunction(x) {
     for (var i = 0; i < x.length; i ++) {
    
      if(x[i].length == 0){
        // array is empty 
        Logger.log('empty'); 
       } else {
        //array not empty
        Logger.log('not empty');
      }
    
     }
    }
    

    我还注意到“;”您的陈述中缺少。您的脚本按原样运行?

    干杯

    【讨论】:

    • 是的!这很有意义。我没有考虑读取每个数据值的长度,而只是检查它是否存在。谢谢!
    • 是的,Google Apps 脚本对它的 ';' 不是很挑剔采用。我意识到这是草率的编码,如果我将其发送给其他人使用,我会清理它。我只是需要为工作准备一些东西,而我没有花时间清理它。不过谢谢!
    • 这对我不起作用......它从未识别出这种情况。 if (value[i].length === 0) { var section1 = sheet.getRange((i+3), 2, 1, 5) var section2 = sheet.getRange((i+3), 8, 1, 3) var cell = sheet.getRange((i+3), 3) section1.setBackground("white") section2.setBackground("white") section1.setBorder(false, null, false, null, null, false) section2 .setBorder(false, null, false, null, null, false) Logger.log("Empty")
    • 尝试纠正你的value[i].length === 0;似乎有一个太多的“=”。
    【解决方案2】:

    我解决了查找数组中的哪个位置为空的问题,而是设置了一个变量来引用循环中的每个单元格并检查它本身是否为空。如果它看到它是,它执行代码块。下面的例子。

    function onEdit() {
      var ss = SpreadsheetApp.getActiveSpreadsheet()
      var sheet = ss.getActiveSheet()
      var range = sheet.getRange("A3:A33")
      var value = range.getValues()
      var sheetCheckRange = sheet.getRange(2,2)
      var sheetCheck = sheetCheckRange.getValue()
      if (sheetCheck == "Date") {
        for (i = 0; i < value.length; i++) {
          var row = sheet.getRange((i + 3), 1, 1, 11)
          var sessionCell = sheet.getRange((i + 3), 3)
          var dateCell = sheet.getRange((i+3), 2)
          var section1 = sheet.getRange((i+3), 2, 1, 5)
          var section2 = sheet.getRange((i+3), 8, 1, 3)
          if (value[i] == 5 || value[i] == 6) {
            row.setBackground("Black")
            row.setBorder(true, null, true, null, null, null)
            //top, left, bottom, right, vertical, horizontal
            sessionCell.setValue("W")
          } if (value[i] == 0 || value[i] == 1 || value[i] == 2 || value[i] == 3 || value[i] == 4) {
            section1.setBackground("white")
            section2.setBackground("white")
            section1.setBorder(false, null, false, null, null, false)
            section2.setBorder(false, null, false, null, null, false)
          } if (dateCell.isBlank()) {
            section1.setBackground("white")
            section2.setBackground("white")
            section1.setBorder(false, null, false, null, null, false)
            section2.setBorder(false, null, false, null, null, false)
            sessionCell.setValue("")
          }
        }
      }
    }
    

    我还通过将函数重命名为 函数 onEdit() 这也使得复制电子表格以在公司内部共享变得更加容易。使用名为“onEdit()”的函数,无需每个用户授权和设置触发器。

    【讨论】:

    • 很好,不知道isBlank
    【解决方案3】:

    ArrayLib library 可以为您做到这一点,它使处理二维数组的过程变得更加简单。为此,您需要 IndexOf 函数,并使用 -1 搜索所有列。

    【讨论】:

    • 我会调查一下,下面的答案建议读取每个值的长度,而空值的长度为 0。我将在需要引入另一个服务之前尝试一下。谢谢!
    • 嗯,这似乎不是我要找的。我需要找到所有空单元格,以便它确切知道要清除哪些单元格并将其重新格式化回基本的干净版本(以编程方式完成)。
    【解决方案4】:

    使用与 null

    的比较
    var x = [[1.0], [2.0], [], [4.0], [5.0], [6.0], [0.0], [1.0], [], [3.0], [4.0], [5.0], [], [], [1.0], [], [3.0], [4.0], [5.0], [6.0], [0.0], [1.0], [2.0], [3.0], [], [5.0], [6.0], [0.0], [1.0], [2.0], []];
    
    function myFunction(x) {
     for (var i = 0; i < x.length; i ++) {
    
      if(x[i] == null){
        // array is empty 
        Logger.log('empty'); 
       } else {
        //array not empty
        Logger.log('not empty');
      }
    
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2021-03-28
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多