如何扩展谷歌应用程序脚本类

How to extend Google apps script classes

本文关键字:谷歌 应用程序 脚本 扩展 何扩展      更新时间:2023-09-26

我试图在脚本中扩展类Sheet,当它试图执行以下操作时,我得到Sheet未定义:

Sheet.prototype.moveColumn = function(SourceIndex, DestinationIndex){
  var source = this.getRange(1, SourceIndex, ss.getLastRow(), 1).getValues()
  var move = SourceIndex-DestinationIndex>0 ? sheet.getRange(1, DestinationIndex,  ss.getLastRow(), SourceIndex-DestinationIndex).getValues() : sheet.getRange(1, SourceIndex, ss.getLastRow(), DestinationIndex-SourceIndex).getValues();
  sheet.getRange(1, DestinationIndex, source.length, 1).setValues(source);
  SourceIndex-DestinationIndex>0 ? sheet.getRange(1, DestinationIndex+1, move.length, move[0].length).setValues(move) : sheet.getRange(1, SourceIndex, move.length, move[0].length);
  return this
}

到目前为止,只有谷歌,而不是它的用户,可以做到这一点,特别是在GAS(谷歌应用程序脚本)中,可以扩展{不是原生JavaScript的类,这是谷歌的类},所以可以做一些像"Sheet.prototype.MyMethod=function(..){..}"这样的事情,其中,谷歌的这些类在每个{功能组件下的"类"下定义,作为GAS官方参考中的第一个"日历"}。

  1. 能够扩展谷歌的类将是非常方便和自然的,包括已知的变通方法(详细介绍如下)也相当丑陋。事实上,我这个答案的发起者发布这个答案是因为最重要的是,我经常想做这样的扩展,我自己也很同情;希望帮助其他尝试做同样的事情。但是
  2. 谷歌为什么阻止这样做,至少是为了用户自己使用,用户似乎不知道。不过
  3. 谷歌在这里感到不安,因为它削弱了他们提供的东西;遗憾的是,不说出原因并不令人惊讶,因为两者都有:
    1. 虽然谷歌的GAS功能主要是JavaScript,事实上它可以说是最好的资产,但GAS实际上有更多令人沮丧的东西;与JS相比,未记录的限制
    2. 令人不安的是,谷歌几乎从来没有告诉用户为什么要终止他们的产品,甚至在做出删除决定之前也没有发出警告,所以看到谷歌也不告诉用户为什么要削弱他们的产品也就不足为奇了
  4. 这个问题的官方报告是问题跟踪器的第708期(来自这个问题的第一个答案),这是关于这个问题的/官方网络讨论,包括任何人在登录谷歌时都可以通过点击讨论的星号或/并在那里发表评论来投票支持这个能力
  5. 已知的尝试,都是直接的&间接,全部失败:
    1. NP4CP4:'图纸.模型.MyMethod=..'gets'ReferenceError:未定义"工作表"。'
    2. NP3LNQ:'电子表格应用程序.getActiveSpreadsheet().getActiveSheet().construtor.prototype.MyMethod=..'gets'TypeError:无法从未定义中读取属性"prototype"。'
    3. NP4CQR:'电子表格应用程序.getActiveSpreadsheet().getActiveSheet().__proto__.MyMethod=..'gets"TypeError:无法将undefined的属性"MyMethod"设置为"(class)@26d5fab1"。"
    4. NP4K1W:'Object.getPrototypeOf(SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()).MyMethod=..'gets'TypeError:无法将null的属性"MyMethod"设置为"(class)@b73c746"。'
  6. 关于这个问题的更多细节,请参阅{更早的更具体的请求}答案"我如何用新函数扩展UiApp?"
  7. 解决方法包括:
    1. NP4J3T:将要添加的每个方法编码为普通函数调用(因此会牺牲方法功能)
    2. NP4IGZ:一个部分的变通方法,适用于这个&在许多情况下,一个类不需要扩展,是define&相反,使用一个新的类,该类存储到要扩展的对象(在原始类中)的链接,并在新类中添加所需的新方法,并且(痛苦的部分)在新类还重新实现原始类的每个现有方法(可能会更改!),其中每个方法都被实现为对原始方法的调用。
      1. 提出这个解决方法可能是发布问题响应c3的原因,这似乎是试图引用GAS包装类示例HeaderRow

您不能扩展Google类的原型。您可以在问题跟踪器issue 708 上找到关于这一点的评论

相关文章: