我正在嘗試學習在 JS 中創建范圍的最佳實踐。我試圖避免我在學習 VBA 時犯的錯誤,我Range("A1:A2")在意識到它更好用之前使用了很長時間的格式,Range(Cells(1,1),Cells(2,1))因為整數通常更容易使用。
我找到getRangeByIndexes了 JS,它并不完美,因為如果第一行不是 0,我必須對行數進行數學運算。我更喜歡使用整數來設定范圍內的第一個和最后一個單元格,但那是另一回事。
目前,如果我在數字中進行硬編碼,我可以選擇范圍,但現在我正在努力添加“LastRow”函式以使范圍動態化,但我無法讓它作業。我也很難讓它列印到console.log,但我決定嘗試使用范圍而不是列印出來。我目前正在編輯taskpane.js,對此非常陌生。
到目前為止,這是我的代碼:
/*
* Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
* See LICENSE in the project root for license information.
*/
/* global console, document, Excel, Office */
// The initialize function must be run each time a new page is loaded
Office.initialize = () => {
document.getElementById("sideload-msg").style.display = "none";
document.getElementById("app-body").style.display = "flex";
document.getElementById("run").onclick = run;
};
export async function run() {
try {
await Excel.run(async (context) => {
var ws = context.workbook.worksheets.getItem("Sheet1");
ws.activate();
var lrow = ws.getUsedRange().getLastRow();
lrow.load("rowindex");
context.sync();
var range = ws.getRangeByIndexes(0, 0, 4, 5); //This Works
//var range = ws.getRangeByIndexes(0, 0, lrow.rowIndex, 5); //This does nothing, but no errors either, just nothing.
range.select();
await context.sync();
console.log("END");
});
} catch (error) {
console.error(error);
}
}
如果我lrow.rowindex用4它替換它會按預期作業。任何人都可以建議我做錯了什么,如果這是生成帶數字范圍的最佳方法(有沒有辦法做第一個/最后一個單元格?)
uj5u.com熱心網友回復:
我相信您必須先呼叫 await context.sync() 才能使用加載的任何屬性。您正在嘗試在 context.sync() 呼叫之前使用加載的屬性 (rowIndex)。所以這就是為什么我認為它不起作用。
如果您從此更新代碼:
var lrow = ws.getUsedRange().getLastRow();
lrow.load("rowindex");
var range = ws.getRangeByIndexes(0, 0, 4, 5); //This Works
//var range = ws.getRangeByIndexes(0, 0, lrow.rowIndex, 5); //This does nothing, but no errors either, just nothing.
range.select();
await context.sync();
對此:
var lrow = ws.getUsedRange().getLastRow();
lrow.load("rowindex");
await context.sync();
//var range = ws.getRangeByIndexes(0, 0, 4, 5); //This Works
var range = ws.getRangeByIndexes(0, 0, lrow.rowIndex, 5); //This does nothing, but no errors either, just nothing.
range.select();
await context.sync();
那應該可以解決問題。
uj5u.com熱心網友回復:
您肯定需要在第一個“context.sync()”陳述句中使用“await”。我補充說,只要作業表 1 上有資料,它就可以正常作業。如果 lrow.rowIndex 評估為 0,它將導致錯誤,因為 getRangesByIndexes 需要至少選擇一行。
這是我運行時的代碼。
async function run() {
try {
await Excel.run(async (context) => {
var ws = context.workbook.worksheets.getItem("Sheet1");
ws.activate();
var lrow = ws.getUsedRange().getLastRow();
lrow.load("rowindex");
await context.sync();
var range = ws.getRangeByIndexes(0, 0, lrow.rowIndex, 5);
range.select();
await context.sync();
console.log("END");
});
} catch (error) {
console.error(error);
}
}
我接受了“出口”指令,因為我作業的環境抱怨它。
如果您有興趣,我正在使用加載項商店中名為“JavaScript 自動化開發環境 (JADE)”的加載項。它旨在自動化作業簿中的代碼,而不是構建加載項,但測驗此類內容非常簡單。免責宣告:我寫了 JADE。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/401794.html
