繁體中文
English 简体中文 繁體中文
Methodox 首頁

工作表函式

活頁簿可以攜帶自己的函式,它們用 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)。

另請參閱