2013-07-02 155 views
1

我想在腳本擴展類表,我也得到表是不確定的,當它試圖執行如下因素:如何延長谷歌Apps腳本類

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 
} 

回答

3

不能擴展谷歌的類的原型。您可以在問題跟蹤器上找到關於此問題的評論,Issue 708

1

到目前爲止,只有谷歌,而不是其用戶可以做到這一點,特別是在GAS(Google Apps Script)中,可以擴展{非本機JavaScript類,它們是類,所以可以做一些'Sheet .prototype.MyMethod = function(..){..}',其中Google的這些類在每個{功能組件下的'Classes'下定義,作爲第一個'Calendar' }在the official GAS reference

  1. 能夠擴展Google的類將非常方便和自然,包括已知的解決方法(下面詳述)也相當難看。事實上,我這個答案的創始人張貼這個答案,因爲最重要的是我經常想自己做這樣的擴展,所以想與&一樣想幫助別人嘗試做同樣的事情。但是...
  2. 爲什麼谷歌防止這種情況,至少對於用戶自己的用途而言,對用戶來說似乎是未知的。雖然...
  3. 谷歌是鐓這裏,由他們提供&既沉重的東西不告訴爲什麼,可悲的是並不奇怪,因爲這兩種:
    1. 雖然谷歌的GAS特點是大多是JavaScript和的確是其可以說是最好的資產,與JS相比,GAS實際上有更多令人不安的侷限性&未被證實的限制。
    2. 谷歌沮喪地幾乎從不告訴用戶他們爲什麼會結束他們的產品,甚至在做出這樣的刪除決定之前都會發出警告,所以看到谷歌也不意外地告訴用戶他們爲什麼會削弱他們的產品。
  4. 的,其他的,這個問題的官方報告the issue tracker's Issue 708(從this Qs 1st answer),這是對問題/一個官方網站的討論,包括在那裏顯然,任何人都可以投票支持這種能力的,當登錄Google,點擊討論的明星或/和評論那裏請求。
  5. 已知嘗試,直接&間接,全部失敗:
    1. NP4CP4: 'Sheet .prototype .MyMethod = ..' 得到 '的ReferenceError:沒有定義 「工作表」'
    2. NP3LNQ:「 SpreadsheetApp.getActiveSpreadsheet()。 getActiveSheet()constructor。原型 .MyMethod = ..'gets'TypeError:無法從未定義的屬性「原型」中讀取'
    3. NP4CQR:'SpreadsheetApp.getActiveSpreadsheet()。getActiveSheet()。 __proto__ .MyMethod = .. ' 得到 '類型錯誤:無法設置的不確定財產 「的MyMethod」 「(類)@ 26d5fab1」。'
    4. NP4K1W:' Object.getPrototypeOf(SpreadsheetApp.getActiveSpreadsheet()getActiveSheet()。) .MyMethod = ..'gets'TypeError:無法將null的屬性「MyMethod」設置爲「(class)@ b73c746」。「
  6. 一些更多的問題的細節是在{更具體的較早的要求}回答」 How can I extend UiApp with a new function?
  7. 解決方法包括:
    1. NP4J3T:每一個代碼的方法來代替添加爲一個普通的函數調用(然後犧牲方法功能)。
    2. NP4IGZ:部分解決方法,對於此類&這是真的,一個類不擴展,定義&取而代之 - 使用一個新的類,它存儲一個鏈接到對象的鏈接(在原始類中)進行擴展,並且在新類中添加所需的新方法,並且新類中的(痛苦部分)也重新實現原始類的每個現有方法(可以改變!委託給)原始方法的調用。
      1. 要提出此變通辦法,可能爲什麼Issue response c3已發佈,這似乎可能是要嘗試引用GAS wrapper class example HeaderRow