準備工作
Script Lab 在 2018 年經曆了一次從頭到尾的重新編寫。雖然其視覺設計與 2017 版保持相似,但其技術堆棧已經過大修,為了能夠利用 React 和 Fabric React 的優秀性質。改進包括了:鍵盤可通路性、更快的運作速度、使用者可配置的設定。
但是為了保持代碼的簡潔性,思來想去還是犧牲以上優點,從目前預設環境(Production)暫時切換到 2017 版本的 Script Lab ,為此需要執行以下操作:
- 打開編輯器窗格,然後選擇或建立一個代碼段;
- 在編輯器的右下角,單擊cog圖示以打開設定;
- 在頁腳左側下拉清單中,選擇“Script Lab 2017”。
最小代碼
【對像層級】
上下文:context
工作簿:workbook
工作表:sheet
單元格:cell
【單元指派】單元值: [["HSOffice"]]
Excel.run
(
async (context) => {
//
const workbook = context.workbook;
const sheet = workbook.worksheets.getActiveWorksheet();
const cell = sheet.getCell(0, 0);
//
cell.values =
[
["HSOffice"]
]
}
);
【小技巧】代碼美化:Shift-Alt-F
Excel.run
我們先從代碼第一行代碼看起:Excel.run。在這裡 Excel 是命名空間,而 run 而是一個啟動函數(我暫時先這樣稱呼,直到找到官方的說法),接受一個函數作為其參數,前傳回一個對像(後面會提到用途)。而這個内部函數,其實是一個批處理函數,代表了真正的 Excel 操作。
批處理函數有一個代表宿主請求的上下文參數,該參數是與宿主(在這裡是 Excel 本身)進行通信的途徑。Excel.run 方法隻是傳向批處理函數傳遞了一個新的上下文請求,批處理函數才是整個代碼的核心部分,在這裡我們看到了最常見的處理方式:
const workbook = context.workbook;
其實更典型的寫法,要會加上錯誤捕獲的部分。補充一點,Excel.run 其實還會傳回一個 Promise 對象(Promise在處理異步操作非常有用)。反正更為正統的寫法是,在啟動函數之後應該始終跟随.catch(錯誤捕獲),示例如下:
//啟動函數
Excel.run
(
//批處理函數
function (context) {
//批處理内容
//傳回代理
return context.sync();
}
).catch
(
//異常處理
);