我有一個腳本,該腳本設定為在發送觸發器時運行,它需要對接收到的資料進行排序以確定要將資料寫入哪個作業表。
我曾經使用確切的名稱對其進行硬編碼并且效果很好,但現在我試圖讓它更容易擴展。value開關中的變數應該是一個數字。
下面是代碼的一個片段。
var myIds = [111, 222, 333, 444];
var myUsers = ['aaa', 'bbb', 'ccc', 'ddd'];
...
switch (param) {
case 1:
break;
case 2:
for (let i = 0; i < myIds.length; i ) {
if (value == myIds[i]) {
userName = myUsers[i];
break;
}
}
userName = 'ETC';
break;
}
if (userName != 'ETC') {
let inSheet = 'In ' userName;
let outSheet= 'Out ' userName;
if (checkIn == true)
sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName(inSheet));
else
sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName(outSheet));
}
else
sheet = SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName('ETC'));
一切都轉到 ETC 表,而不是轉到它們各自的輸入/輸出表。其他時候,床單上根本不會有任何變化。除了問題之外,如果有人能解釋為什么會發生這種情況,我們將不勝感激。
提前致謝。
uj5u.com熱心網友回復:
在break;里面你for僅環跳出最近的for回圈,而不是case。所以你跳出for并最終到達userName = "ETC";,這會覆寫回圈可能設定的任何值。
相反,您可以使用indexOf或findIndex:
case 2:
const index = myIds.indexOf(value); // Or `.findIndex(id => id == value)` if you need `==` not `===`
userName = index === -1 ? "ETC" : myUsers[index];
break;
如果你真的想要for回圈,你可以userName在回圈之前分配,以便回圈覆寫"ETC":
case 2:
userName = "ETC";
for (let i = 0; i < myIds.length; i ) {
if (value == myIds[i]) {
userName = myUsers[i];
break;
}
}
break;
旁注:我建議避免像myIdsand這樣的并行陣列myUsers。最終更新一個而不是另一個真的很容易。相反,請考慮一組物件:
const users = [
{id: 111, name: "aaa"},
{id: 222, name: "bbb"},
{id: 333, name: "ccc"},
{id: 444, name: "ddd"},
];
那么上面的第一個例子將使用find:
case 2:
const user = users.find(({id}) => id == value);
userName = user ? user.name : "ETC";
break;
在具有可選鏈接和無效合并的真正現代環境中,您可以更改userName = user ? user.name : "ETC";為,userName = user?.name ?? "ETC";但條件版本沒有任何問題。
旁注 2:您已let在for回圈中使用過,因此您似乎正在使用支持 ES2015 功能的更現代的 GAS。我建議不要var在新代碼中使用,始終使用let或const。
uj5u.com熱心網友回復:
顯然,問題出在我沒有包含在問題中的另一部分代碼中,我在每個回圈中都重新初始化了 userName 變數。這導致 userName 變數在某些回圈中未定義,進而導致getSheetByName函式回傳錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/374841.html
