2013-07-13 50 views
5

我在單元格中具有以下功能。它從其他單元格中讀取日期,比計算年齡並將其轉換爲格式「3周5天」Google電子表格自定義功能由內置的電子表格功能組成

=INT((TODAY()-D19)/7)&" weeks, "&(TODAY()-D19-(INT((TODAY()-D19)/7)*7))&" days" 

它的工作原理。

現在我想換掉這個長字符串成一個簡單的函數:

=AGEINWEEKS(D19) 

我怎麼能這樣做?

我已經嘗試過的腳本編輯器

function ageInWeeks(from_date) { 
    return SpreadsheetApp.getActiveSheet().getRange("D16").setFormula('=ROUND((TODAY()-D16)/7)&" weeks, "&(TODAY()-D16-(ROUND((TODAY()-D16)/7)*7))&" days"'); 
} 

寫這個劇本,但它返回錯誤

error: You do not have permission to call setFormula (line 3, file "Code")

預先感謝您!

問候, 托馬日

回答

7

如果您希望創建自定義函數以獲得與電子表格函數相同的結果,則必須以執行計算的方式使用Google Apps腳本,而不是嘗試使用它來設置公式插入到電子表格中(正如Serge指出的那樣,由於不允許使用)。 (另外,爲了讓將來的讀者清楚,Google Apps腳本及其自定義函數無法使用Google電子表格公式進行計算,它們使用javascript語言進行計算。另一方面,腳本通過setFormulas 可以用於將電子表格公式寫入單元格中,其中電子表格公式將執行計算......但是如果腳本被用作自定義函數,則不能執行此操作(即,如果它在單元格內被調用an = sign),但是只有在腳本是從另一種方式調用的,例如菜單項或觸發器,它是響應電子表格編輯的觸發器或定時)

所以,你可以寫javascript到自定義函數來計算周,天,這樣一個劇本可能是:

function ageInWeeks(date) { 
var mil = new Date() - new Date(date).getTime() 
var seconds = (mil/1000) | 0; 
mil -= seconds * 1000; 

var minutes = (seconds/60) | 0; 
seconds -= minutes * 60; 

var hours = (minutes/60) | 0; 
minutes -= hours * 60; 

var days = (hours/24) | 0; 
hours -= days * 24; 

var weeks = (days/7) | 0; 
days -= weeks * 7; 
return weeks +' wks, ' + days + ' days' 

} 

這可以被放入電子表格中的任意單元格,除了D19如果它指的是D19,例如:

=ageInWeeks(D19) 

其中單元格D19包含過去的日期。

(請注意,自定義函數可能比你原來的電子表格公式慢)

+0

謝謝您的詳細解答!代碼完美工作。 – tomazzlender

2

documentation : 自定義函數返回值,但不能設置它們在細胞之外的數值。在大多數情況下,在A1單元格的自定義函數不能修改單元格A5。

如果你描述你的tipycal用例,你可以建議另一種方法。

+0

如果函數返回像'[「」,「」,「」,「」,「價值」]', * A5 *將填寫'Value' –

相關問題