首先,這是來自我的Google Sheet的鏈接:
。https://docs.google.com/spreadsheets/d/1vROojeTBYnSQy0IeYY0vkzump-CPoDd5fyFuLwRZsjQ/edit?usp=sharing
我有2張表:一張(Sheet1)包含一個帶有IP地址、主機名和交換機 埠的機器串列。我的腳本的目的是讀取作業表1中的交換機和埠,然后在作業表2的相應單元格中放入一個注釋(作業表2包含可用的交換機及其48個埠的圖表),該注釋必須包含主機名和IP地址。
該腳本可以作業,但要一個一個地添加注釋,如果我的機器數量增加,可能需要30分鐘以上。
你有什么辦法可以加快這個程序嗎?
uj5u.com熱心網友回復:
問題是:
你目前正在迭代Sheet1中的源值,并使用TextFinder來查找Sheet2中的相應單元格。迭代使用TextFinder大大增加了對電子表格的請求量,這使得腳本的速度大大降低(見盡量減少對其他服務的呼叫)。
按照同樣的思路,你通過setNote單獨設定每個單元格的注釋,而不是像setNotes(notes)那樣,一次性設定所有的注釋。
解決方案:
我想提出一個替代方法,以盡量減少對電子表格的呼叫,從而使腳本的速度大大加快:
我想提出一個替代方法。
Sheet1(note、switch和port)中獲取有用的資料,將其轉換為一個物件陣列,以方便日后的檢索。
Sheet2中的所有資料。Sheet2中的資料,對于每一行,檢查當前行的A列(對于奇數port號碼)或上面兩行(對于偶數port號碼)是否包含一個有效的switch名稱(你可以使用find來實作)。switch名稱,則為這個map迭代回傳一個null陣列(因為提供null作為setNote的引數會洗掉該注釋)。
switch名稱,使用map遍歷該行的埠,對于每個port,尋找源資料中switch和port的有效組合。
switch和port的有效組合,回傳該map迭代的相應note。
Sheet1不包含該組合的資料),對于該迭代回傳null。
maps建立了notes的2D陣列,使用setNotes將這些筆記設定到Sheet2的port列。
代碼示例:
function actualiserNP2(){
const SWITCH_COL = 1;
const PORT_FIRST_COL = 4;
const PORT_LAST_COL = 27;
const ss = SpreadsheetApp.getActiveSpreadsheet() 。
const Sheet2 = ss.getSheetByName('Sheet2')。
const Sheet1 = ss.getSheetByName('Sheet1')。
const tabGeneral = Sheet1. getRange(10,2, Sheet1. getLastRow(), Sheet1.getLastColumn()).getValues()。
const sourceData = tabGeneral.filter(span class="hljs-params">row => row[7] 。 includes("#")).map(span class="hljs-params">row => {
const [sw1a, sw1b] = row[7].split("#")。
const data = {
"note": `${row[0]}。
${row[5]}`。
"switch"/span>: sw1a,
"port": sw1b
}
return data。
});
const targetData = Sheet2.getDataRange().getValues() 。
const notes = targetData.map((row,i) => /span> {
const sourceSwitch = sourceData. find(sourceRow => sourceRow["switch"] === row[SWITCH_COL-1] || (i > 1 && sourceRow["switch"] === targetData[i-2][SWITCH_COL-1] )。
if (sourceSwitch) {
const currentSwitch = sourceSwitch["switch"/span>]。
const ports = row. slice(PORT_FIRST_COL-1, PORT_LAST_COL) 。
const rowNotes = ports.map(port =>/span> {
const sourceRow = sourceData. find(span class="hljs-params">row => row["switch"] == currentSwitch & & Number(row["port"]) === Number(port))。
if (sourceRow) return sourceRow["note"] 。
else return null;
});
return rowNotes;
} else {
return new Array(PORT_LAST_COL-PORT_FIRST_COL 1)。) fill(null)。
}
});
Sheet2.getRange(1, PORT_FIRST_COL, Sheet2. getLastRow(), PORT_LAST_COL-PORT_FIRST_COL 1)。) setNotes(note)。
}
uj5u.com熱心網友回復:
我修改了lamblichus的腳本,使其適應3個埠。 它可以和這個新的腳本一起使用:
function actualiserNP1()
{
const SWITCH_COL = 1;
const PORT_FIRST_COL = 4;
const PORT_LAST_COL = 27;
const ss = SpreadsheetApp.getActiveSpreadsheet() 。
const Sheet2 = ss.getSheetByName('Sheet2')。
const Sheet1 = ss.getSheetByName('Sheet1')。
const tabGeneral = Sheet1. getRange(10,2, Sheet1. getLastRow(), Sheet1.getLastColumn()).getValues()。
const data = [];
const sourceData = tabGeneral.filter(span class="hljs-params">row => row[7] 。 includes("#") || row[11] 。 includes("#") || row[15].includes("#"))。 map(row => { // On filtre les lignes ayant au moins un port
//§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 001。
if(row[7]=='&& row[11]=='' && row[15] ! ='')
{
if(row[13]!=''/span>){
const [sw3a, sw3b] = row[15].split("#")。
data.push({
"note"。`${row[0]}。
${row[13]}`。
"switch"/span>: sw3a,
"port": sw3b
})
}else{
const [sw3a, sw3b] = row[15].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw3a,
"port": sw3b
})
}
}
//§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 010。
if(row[7]=='&& row[11] ! ==''/span> && row[15]==''/span>)
{
if(row[9]! =''/span>){
const [sw2a, sw2b] = row[11].split("#")。
data.push({
"note"。`${row[0]}。
${row[9]}`。
"switch"/span>: sw2a,
"port": sw2b
})
}else{
const [sw2a, sw2b] = row[11].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw2a,
"port": sw2b
})
}
}
//§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 011。
if(row[7]=='&& row[11] ! =''/span> && row[15]!=''/span>)
{
if(row[9]!=''/span>){
const [sw2a, sw2b] = row[11].split("#")。
data.push({
"note"。`${row[0]}。
${row[9]}`。
"switch"/span>: sw2a,
"port": sw2b
})
}else{
const [sw2a, sw2b] = row[11].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw2a,
"port": sw2b
})
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$。
if(row[13]! =''){
const [sw3a, sw3b] = row[15].split("#")。
data.push({
"note"。`${row[0]}。
${row[13]}`。
"switch"/span>: sw3a,
"port": sw3b
})
}else{
const [sw3a, sw3b] = row[15].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw3a,
"port": sw3b
})
}
}
//§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 100。
if(row[7]! =' && row[11]==' && row[15]==')
{
const [sw1a, sw1b] = row[7].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw1a,
"port": sw1b
})
}
//§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 101。
if(row[7]! =' && row[11]==' && row[15]! =')
{
if(row[13]!=''){
const [sw3a, sw3b] = row[15].split("#")。
data.push({
"note"。`${row[0]}。
${row[13]}`。
"switch"/span>: sw3a,
"port": sw3b
})
}else{
const [sw3a, sw3b] = row[15].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw3a,
"port": sw3b
})
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
const [sw1a, sw1b] = row[7].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw1a,
"port": sw1b
})
}
//§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 110。
if(row[7]!=' && row[11] ! ='' && row[15]=='')
{
if(row[9]! =''/span>){
const [sw2a, sw2b] = row[11].split("#")。
data.push({
"note"。`${row[0]}。
${row[9]}`。
"switch"/span>: sw2a,
"port": sw2b
})
}else{
const [sw2a, sw2b] = row[11].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw2a,
"port": sw2b
})
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
const [sw1a, sw1b] = row[7].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw1a,
"port": sw1b
})
}
//§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ 111。
if(row[7]!=' && row[11] ! =' && row[15]!=')
{
if(row[9]!=''/span>){
const [sw2a, sw2b] = row[11].split("#")。
data.push({
"note"。`${row[0]}。
${row[9]}`。
"switch"/span>: sw2a,
"port": sw2b
})
}else{
const [sw2a, sw2b] = row[11].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw2a,
"port": sw2b
})
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
if(row[13]! =''){
const [sw3a, sw3b] = row[15].split("#")。
data.push({
"note"。`${row[0]}。
${row[13]}`。
"switch"/span>: sw3a,
"port": sw3b
})
}else{
const [sw3a, sw3b] = row[15].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw3a,
"port": sw3b
})
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
const [sw1a, sw1b] = row[7].split("#")。
data.push({
"note"。`${row[0]}。
${row[5]}`。
"switch"/span>: sw1a,
"port": sw1b
})
}
return data;
});
console.log(資料)。
//console.log(sourceData);.
const targetData = Sheet2.getDataRange().getValues()。
const notes = targetData.map((row,i) => /span> {
const sourceSwitch = data. find(sourceRow => sourceRow["switch"] === row[SWITCH_COL-1] || (i > 1 && sourceRow["switch"] === targetData[i-2][SWITCH_COL-1] )。
if (sourceSwitch)
{
const currentSwitch = sourceSwitch["switch"/span>]。
const ports = row. slice(PORT_FIRST_COL-1, PORT_LAST_COL) 。
const rowNotes = ports.map(port =>/span> {
const sourceRow = data. find(span class="hljs-params">row => row["switch"] == currentSwitch & & Number(row["port"]) === Number(port))。
if (sourceRow) return sourceRow["note"] 。
else return null;
});
return rowNotes;
} else {
return new Array(PORT_LAST_COL-PORT_FIRST_COL 1)。) fill(null)。
}
});
Sheet2.getRange(1, PORT_FIRST_COL, Sheet2. getLastRow(), PORT_LAST_COL-PORT_FIRST_COL 1)。) setNotes(note)。
}
我是個初學者,所以我對每種可能的情況都做了說明。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/319352.html
標籤:
