【问题标题】:.getValues cannot read Custom Function.getValues 无法读取自定义函数
【发布时间】:2020-12-22 15:27:38
【问题描述】:

我必须使用 Google Apps 脚本为内部客户创建自动报告。直截了当:检索数据、操作数据、一些 if 测试以及以新格式打印数据。

我的问题是,数据源使用了一个非常复杂的自定义函数(也是我设计的,用于日期计算),这对客户端来说是必不可少的,而且显然我无法使用方法 .getValues 来自自定义函数。

这是我得到的错误:

9:42:41 AM  Error  Exception: Cannot convert 'function () { [native code] }' to int.
ARROBA  @ Scripts Automáticos.gs:5

这是 GAS 中的一个真正问题吗?是否有任何解决方法?或者,更好的是,我编码错误了吗?我尝试了间接引用(例如,不是直接从自定义函数获取数据,而是从引用该数据的其他单元格获取数据),但它不起作用。

这是出现问题的那一行:

var data = ss.getRange(2, 1, ss.getLastRow, ss.getLastColumn).getValues

以下是不起作用的代码示例:

function ARROBA() {

  var ss = SpreadsheetApp.openById([ID]).getSheetByName([sheet])

  var data = ss.getRange(2, 1, ss.getLastRow, ss.getLastColumn).getValues

  var today = new Date()

  var x
  var y

  for (x = 0; x < data.length; x++) {
    if (data[x][34] == "Sim") {
      ss.getRange(x+2,7).setValue(data[x][7]+"\n@\n"+(today.getDay+'/'+today.getMonth+'/'+today.getFullYear))
      ss.getRange(x+2,34).setValue()
      ss.getRange(x+2,35).setValue(data[x][35]+"\n@\n")
      ss.getRange(x+2,36).setValue(data[x][36]+"\n@\n")
      ss.getRange(x+2,37).setValue(data[x][37]+"\n@\n")
      ss.getRange(x+2,38).setValue(data[x][38]+"\n@\n")
    }
  }
}

这里是自定义函数:

  function SLABANKING (start, startcongelamento, finalcongelamento, startdeclinio, finaldeclinio, cancelamento, end) {
  
  var today = new Date();
  var congelamento = 0
  var declinio = 0
  var x
  var y
  var z
  var s
  //typing error handling
  if (start == null || start == '') {
    return 'Necessário incluir data de início'
    } else if(startcongelamento.toString.length != finalcongelamento.toString.length && startcongelamento.toString.length - finalcongelamento.toString.length != 11) {
      return 'Erro de preenchimento de datas de congelamento'
    } else if(startdeclinio.toString.length != finaldeclinio.toString.length && startdeclinio.toString.length - finaldeclinio.toString.length != 11) {
      return 'Erro de preenchimento de datas de reabertura'
    } else {      
      //set de variáveis + complexas
      if(startcongelamento.toString().lastIndexOf('@') < 0) {
        var sconge = startcongelamento.toString().split('\n')
        var fconge = finalcongelamento.toString().split('\n')
        var sdec = startdeclinio.toString().split('\n')
        var fdec = finaldeclinio.toString().split('\n')
      } else {
        var sconge = startcongelamento.toString().slice(startcongelamento.toString().lastIndexOf('@')+2, startcongelamento.length).split('\n')
        var fconge = finalcongelamento.toString().slice(finalcongelamento.toString().lastIndexOf('@')+2, finalcongelamento.length).split('\n')
        var sdec = startdeclinio.toString().slice(startdeclinio.toString().lastIndexOf('@')+2, startdeclinio.length).split('\n')
        var fdec = finaldeclinio.toString().slice(finaldeclinio.toString().lastIndexOf('@')+2, finaldeclinio.length).split('\n')
      }
      //congelamento
      if(startcongelamento == null || startcongelamento == undefined || startcongelamento == ''){
      } else if(startcongelamento.length != finalcongelamento.length) {
        if (startcongelamento.length > 10 && finalcongelamento.length > 10) {
          Logger.log('desigual, start e final > 10')
          var display = []
          for (x = 0; x < sconge.length; x++) {
            if (x == sconge.length-1) {
              display.push(Math.floor(((Date.parse(today) - new Date(sconge[x].toString().slice(3,5)+'/'+sconge[x].toString().slice(0,2)+'/'+sconge[x].toString().slice(6,10)))/8.64E7)))
            } else {
              display.push((new Date(fconge[x].toString().slice(3,5)+'/'+fconge[x].toString().slice(0,2)+'/'+fconge[x].toString().slice(6,10)) - new Date(sconge[x].toString().slice(3,5)+'/'+sconge[x].toString().slice(0,2)+'/'+sconge[x].toString().slice(6,10)))/8.64E7)
            }
          }
          for (y = 0; y < display.length; y++) {
            congelamento = Number(congelamento) + Number(display[y])
          }
          return Math.ceil(congelamento)
        } else if (startcongelamento.length > 10) {
          Logger.log('desigual, só start > 10')
          var display = []
          for (x = 0; x < sconge.length; x++) {
            if (x == sconge.length-1) {
              display.push(Math.floor(((Date.parse(today) - new Date(sconge[x].toString().slice(3,5)+'/'+sconge[x].toString().slice(0,2)+'/'+sconge[x].toString().slice(6,10)))/8.64E7)))
            } else {
              display.push((new Date(fconge) - new Date(sconge[x].toString().slice(3,5)+'/'+sconge[x].toString().slice(0,2)+'/'+sconge[x].toString().slice(6,10)))/8.64E7)
            }
          }
          for (y = 0; y < display.length; y++) {
            congelamento = Number(congelamento) + Number(display[y])
          }
          return Math.ceil(congelamento)
        } else {
          Logger.log('desigual, nenhum > 10')
          congelamento = Math.floor(((Date.parse(today) - new Date(sconge))/8.64E7))
          return Math.ceil(congelamento)
        }
      } else {
        if (startcongelamento.length > 10) {
          Logger.log('igual, start e final > 10')
          for (x = 0; x < sconge.length; x++) {
            congelamento = congelamento + (new Date(fconge[x].toString().slice(3,5)+'/'+fconge[x].toString().slice(0,2)+'/'+fconge[x].toString().slice(6,10)) - new Date(sconge[x].toString().slice(3,5)+'/'+sconge[x].toString().slice(0,2)+'/'+sconge[x].toString().slice(6,10)))/8.64E7
          }
        } else {
          Logger.log('igual, nenhum > 10')
          congelamento = (new Date(fconge) - new Date(sconge))/8.64E7
        }
      }
      //declinio
      if (startdeclinio == null || startdeclinio == undefined || startdeclinio == ''){
      } else {
        if (startdeclinio.length > 10) {
          Logger.log('declinio, >10')
          for (y = 0; y < sdec.length; y++) {
            declinio = declinio + (new Date(fdec[y].toString().slice(3,5)+'/'+fdec[y].toString().slice(0,2)+'/'+fdec[y].toString().slice(6,10)) - new Date(sdec[y].toString().slice(3,5)+'/'+sdec[y].toString().slice(0,2)+'/'+sdec[y].toString().slice(6,10)))/8.64E7
          }
        } else {
          Logger.log('declinio, <10')
          declinio = (new Date(fdec) - new Date(sdec))/8.64E7
        }
      }

      if (start.length > 10) {
        var nstart = start.toString().slice(start.toString().lastIndexOf('@')+2, start.length)
        if(cancelamento != null && cancelamento != '') {
          return ((((new Date(cancelamento) - new Date(nstart.toString().slice(3,5)+'/'+nstart.toString().slice(0,2)+'/'+nstart.toString().slice(6,10)))/8.64E7 - congelamento) - declinio))
        } else if(end != null && end != '') {
          return ((((new Date(end) - new Date(nstart.toString().slice(3,5)+'/'+nstart.toString().slice(0,2)+'/'+nstart.toString().slice(6,10)))/8.64E7 - congelamento) - declinio))
        } else {
          return ((Math.floor((Date.parse(today) - new Date(nstart.toString().slice(3,5)+'/'+nstart.toString().slice(0,2)+'/'+nstart.toString().slice(6,10)))/8.64E7) - congelamento) - declinio)
        }
      } else {
        var nstart = start
        if(cancelamento != null && cancelamento != '') {
          return ((((new Date(cancelamento) - new Date(start))/8.64E7 - congelamento) - declinio))
        } else if(end != null && end != '') {
          return ((((new Date(end) - new Date(start))/8.64E7 - congelamento) - declinio))
        } else {
          return ((Math.floor((Date.parse(today) - new Date(start))/8.64E7) - congelamento) - declinio)
        }
      }     
    }
  }

【问题讨论】:

  • .getValues 未被调用。这是故意的吗?

标签: javascript typescript function google-apps-script google-sheets


【解决方案1】:

所以,我知道我做错了什么。谢谢evolutionxbox,顺便说一句,因为你激发了我的创造力。

我实际上并没有调用这些方法。更改语法后,代码就可以工作了。

不知道这是否是我的侥幸,或者自动完成参数是否发生了变化,但无论如何,是的,必须调用方法而不能调用参数。 :P

【讨论】:

  • 您将自己与其他编程语言混淆了。在 google-apps-script 中,调用方法时总是使用括号。
猜你喜欢
  • 2021-02-27
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多