我才開始使用 Apps 腳本幾個月,通常我可以弄清楚為什么它會給我錯誤訊息。但是這個最新的讓我完全被難住了,我找不到任何人在這里問過類似的問題。
我有非常簡單的代碼,它從電子表格中檢索資料,回圈遍歷它以洗掉一些值,然后再將其粘貼回另一張作業表中。但是,回圈不斷拋出錯誤“TypeError:無法讀取未定義的屬性'0'”。
經過一番挖掘,我想我找到了問題——我從作業表中提取的陣列比它應該的少了 3 行。
var refArray = sheet.getRange("F5:F").getValues();即使作業表中有 68 行,長度也是 65 。
但真正讓我困惑的是,當我運行時var len = refArray.length它回傳 68!因此,由于缺乏更好的術語,這使我的回圈感到困惑,因為它找不到最后 3 項,并且我得到了上述錯誤(至少我是這么認為的)。
我嘗試使用提取資料,
var refArray = sheet.getRange(1,6,sheet.getMaxRows(),1)但這也只是跳過了最后 3 行。沒有特別的原因會跳過這些行,有時它只跳過 2 行,所以我認為問題不在于我的資料......
如果有幫助,我可以分享我的作業表和腳本的模型,我不知道它為什么這樣做或如何解決它!
已經謝謝大家了。
編輯
我可能一直在吠叫錯誤的樹,因為我只是試圖在另一張紙上復制問題并且陣列似乎被正確提取,但是當它開始回圈時再次彈出錯誤。正如我所說,我只是涉足 Apps 腳本,所以我的回圈非常基本。我將在下面添加完整的序列,看看是否有人能發現錯誤:
var s = SpreadsheetApp.getActive();
var sheet = s.getSheetByName("Sheet1");
var sheet2 = s.getSheetByName("Sheet2");
function test() {
// get archive Array
var archiveArray = sheet2.getRange("A3:A").getValues();
console.log("Array Check: " archiveArray[0][0]);
// get ref Array to loop through
var refArray = sheet.getRange("F2:F").getValues();
console.log("Array Check: " refArray[0][0]); // length 29
var len = refArray.length;
console.log(len); // length 29
for ( var l = len - 1; l > 0; l--){
for( var a = 0; a < archiveArray.length; a ) {
if ( archiveArray[a][0] == refArray[l][0] ) {
refArray.splice(l,1); // remove all duplicates
}
}
}
console.log("New array:" refArray);
uj5u.com熱心網友回復:
由于.splice 洗掉了一個元素,因此l相應地調整索引:
refArray.splice(l,1);
--l;//adjust index by 1
uj5u.com熱心網友回復:
我建議使用array.includes()方法并創建一個新陣列而不是更改現有陣列:
有一個回圈:
var archiveArray = ['a', 'b', 'c', 'd'];
var refArray = ['a', 'b', 'e', 'f'];
var new_refArray = [];
for (var val of refArray) {
if (!archiveArray.includes(val)) new_refArray.push(val)
}
console.log(new_refArray); // output [ 'e', 'f' ]
或使用過濾器:
var archiveArray = ['a', 'b', 'c', 'd'];
var refArray = ['a', 'b', 'e', 'f'];
var new_refArray = refArray.filter(val => !archiveArray.includes(val));
console.log(new_refArray); // output [ 'e', 'f' ]
最終的代碼可以是這樣的:
var s = SpreadsheetApp.getActive();
var sheet = s.getSheetByName("Sheet1");
var sheet2 = s.getSheetByName("Sheet2");
function test() {
var archiveArray = sheet2.getRange("A3:A").getValues()
.flat().filter(String); // convert 2D into 1D and remove empty elements
var refArray = sheet.getRange("F2:F").getValues()
.flat().filter(String); // convert 2D into 1D and remove empty elements
var new_refArray = refArray.filter(val => !archiveArray.includes(val));
console.log(new_refArray);
}
注意:如果要將結果陣列粘貼回作業表上,它應該是 2D 陣列。您可以通過這種方式將平面陣列轉換為二維陣列:
new_refArray = new_refArray.map(x => [x]); // [a,b,c] --> [[a],[b],[c]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410404.html
標籤:
