如何扩展Google Apps脚本类

ale*_*rjh 4 javascript google-apps-script

我试图在脚本中扩展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
}
Run Code Online (Sandbox Code Playgroud)

Mog*_*dad 5

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


Des*_*ect 5

到目前为止,只有谷歌,而不是它的用户,可以做到这一点,特别是在GAS(谷歌Apps脚本),可以延长{不属于本地JavaScript类,这是类由谷歌},所以可以做一些如“ .prototype.MyMethod = function(..){..}”,其中Google定义的这些类在每个{功能组件下的“类”下定义,作为正式GAS参考第一个“日历”} 。

  1. 能够扩展Google的类将非常方便和自然,包括已知的解决方法(在下面详细介绍)也非常难看。的确,我是这个答案的发起人发布此答案的原因,因为最重要的是,我经常想自己做这样的扩展,所以我很同情并希望帮助其他尝试做同样的事情的人。但...
  2. 为什么Google阻止这种情况(至少是出于用户自身的使用目的)对于用户而言似乎是未知的。虽然...
  3. 令人沮丧的是,Google都在削弱自己所提供的东西,却不告诉原因,这两者都令人惊讶,因为两者:
    1. 尽管Google的GAS功能主要是JavaScript,并且实际上可以说是其最好的资产,但与JS相比,GAS实际上还有更多令人沮丧和未记录的限制。
    2. Google几乎没有人告诉过他们为什么终止他们的产品,甚至没有在做出此类删除决定之前发出警告,因此看到Google也没有告诉用户为什么他们使他们的产品瘫痪似乎并不奇怪。
  4. 该问题的其他官方报告是问题跟踪器的Issue 708(来自第1题的第一个答案),是关于该问题的官方网络讨论,其中包括显然任何人都可以在签署协议后为此功能投票进入Google,请点击讨论的星标或/并在其中评论以请求它。
  5. 直接和间接的已知尝试均失败:
    1. NP4CP4:“ Sheet .prototype .MyMethod = ..”得到“ ReferenceError:未定义“ Sheet”。
    2. NP3LNQ:'SpreadsheetApp.getActiveSpreadsheet()。getActiveSheet()构造函数 .prototype .MyMethod = ..'得到'TypeError:无法从未定义中读取属性“ prototype”。
    3. NP4CQR:'SpreadsheetApp.getActiveSpreadsheet()。getActiveSheet()。__proto__ .MyMethod = ..'得到'TypeError:无法将未定义的属性“ MyMethod”设置为“(class)@ 26d5fab1”。
    4. NP4K1W:' Object.getPrototypeOf(SpreadsheetApp.getActiveSpreadsheet()。getActiveSheet()).MyMethod = ..'得到'TypeError:无法将null的属性“ MyMethod”设置为“(class)@ b73c746”。
  6. 有关问题的更多详细信息,请参见{更早的特定请求}回答' 如何使用新功能扩展UiApp?'
  7. 解决方法包括:
    1. NP4J3T:将要添加的每个方法编码为普通的函数调用(因此牺牲了方法的功能)。
    2. NP4IGZ:一种局部解决方法,对于在这种情况下以及在许多情况下不扩展类的情况都是适用的,它是定义并改为使用一个新类来存储指向要扩展的对象(在原始类中)的链接,并在新类添加了所需的新方法,新类中的(痛苦的部分)还重新实现了原始类的每个现有方法(可能会改变!),这些方法在仅实现(委托给)的情况下将需要调用原始方法。
      1. 要建议这种解决方法,可能是发布问题响应c3的原因,似乎它可能是在尝试引用GAS包装器类示例HeaderRow