工作表函式
活頁簿可以攜帶自己的函式,它們用 Lua、C#、Python 編寫,或以 Divooka 圖的形式編寫,公式可以像呼叫任何內建函式一樣呼叫它們:=LUA.TAX(B2)、=CS.SUMSQ(A1:A10)、=PY.TAX(B2)、=DVK.LOANPAYMENT(B1, B2, B3)。它們是 Function:根據實參計算出一個值,不能更改活頁簿,並在其讀取的儲存格發生變化時重新計算。
宣告函式
在 Scripts 窗格中,把它們寫在名為 functions.lua、functions.csx 或 functions.py(或 anything.functions.lua 等)的指令碼中,然後儲存。每個名稱全部為大寫字母的頂層函式都會成為工作表函式;其他函式是工作表看不到的輔助函式。
--- Twice its argument.
---@param x number
function DOUBLE(x) return x * 2 end
--- Tax on an amount, at 20% unless a rate is given.
---@param rate? number
function TAX(amount, rate) return amount * (rate or 0.2) end
/// <summary>Tax on an amount.</summary>
double TAX(double amount, double rate = 0.2) => amount * rate;
double SUMSQ(double[] values) => values.Sum(v => v * v);
int COUNT(params object[] items) => items.Length;
Lua 函式以 LUA.NAME 的形式呼叫,C# 函式以 CS.NAME 的形式呼叫,因此上述函式分別為 =LUA.DOUBLE(A1)、=LUA.TAX(B2, 0.15)、=CS.SUMSQ(A1:A10) 和 =CS.COUNT(A1, B1, C1)。它們會連同參數和說明一起出現在 Insert Function 中。
- 說明和參數。 在 Lua 中,函式上方的
---行是它的說明;---@param name type為參數指定型別(number、string、boolean),name?使其成為可選參數,...可接受任意數量的實參。在 C# 中,///摘要是說明,參數型別決定實參的轉換方式,預設值使參數成為可選參數,params可接受任意數量的實參。 - 區域。 在 Lua 中宣告為表(
---@param values table)或在 C# 中宣告為陣列(double[]、object[,])的參數會接收整個區域,形式為由值組成的行。對於其他任何被傳入區域的參數,函式會應用到每個儲存格,結果會溢位。 - 結果。 數字、文字或邏輯值;返回由行組成的表(Lua)或二維陣列(C#)會將其溢位。返回圖片的函式(例如圖的圖表或
host.getImage(url))會在其儲存格中按比例適應顯示圖片,與 Excel 的IMAGE相同,儲存格的值為Image W×H。
儲存函式指令碼會重新載入它,並重新計算所有呼叫其函式的儲存格。
Python 和 Divooka 圖
functions.py 中的 Python 函式以 =PY.NAME(...) 的形式呼叫;參見 Python。活頁簿的圖文件中每個以大寫字母命名的 Function 圖都是一個工作表函式,以 =DVK.NAME(...) 的形式呼叫;參見 Divooka 圖。
參數和取得的資料
函式在 Lua 和 Python 中以 param.Name、在 C# 中以 Param["Name"] 讀取文件的參數,公式則以 =PARAM("Name") 直接讀取參數;更改參數會精確地重新計算讀取它的儲存格。
通過宿主(host.get 及其同類呼叫)從網路取得資料或讀取檔案的函式是資料來源 Function:在 Data ▸ Refresh Data(Ctrl+Shift+F5)取得資料之前,它顯示 #N/A,之後會以上次重新整理取得並儲存在活頁簿中的內容作答,直到下一次重新整理或它讀取的參數發生變化。第一次重新整理時會要求你 Allow 它要取得的內容。如需不編寫程式碼就從資料庫或 Web API 取得表格,請使用 Data Source。
限制
- 計算時間超過 2 秒的 Lua 函式呼叫(等待宿主取得資料的時間不計入)會被停止,並返回錯誤。函式只能通過其實參和文件的參數讀取活頁簿,沒有
app、doc或os。 - 對於相同實參,函式的結果會被重複使用,而不會重新計算。
- 命名的
LAMBDA尚未出現在 Insert Function 中。
啟用
函式儲存在活頁簿中,因此活頁簿到哪裡,函式就到哪裡。在活頁簿被啟用之前,它們不會執行:在此之前,呼叫它們的儲存格顯示 #BLOCKED!(Excel 中表示資源被阻止的錯誤),網格上方的欄顯示 Scripts disabled 以及一個 Enable 按鈕。活頁簿根本沒有宣告的函式仍顯示 #NAME?。參見信任。啟用之後,如果活動儲存格的函式失敗,該欄會顯示失敗原因,以及指令碼的檔案和行號。
在 Excel 中
Excel 會在檔案中保留函式的指令碼,並保留公式的原樣,但無法執行它們:這些儲存格在 Excel 中顯示 #NAME?。
擴充可以為每個活頁簿新增函式,以擴充自身的字首呼叫,例如 =TOOLS.SPELLNUMBER(1234.5)。
另請參閱
- Formula 函式,即內建函式
SQL.VIEW,基於 SQL 的 Function