2013-10-04 15 views
2

我在Google應用程序中爲電子表格構建了一個腳本,讓我可以隱藏H列中包含星號(*)的行。電子表格目前有700多行,當我運行腳本時,大約需要90秒才能完成,我可以看到結果。 Aint'沒有人花時間來處理數據,所以我正在努力提高效率。在90秒以上的谷歌應用程序腳本中提高性能

這就是拼湊在一起的代碼的樣子,我不知道如何將其重寫得更快。我在這裏得到靈感; Hide Rows in a Google Spreadsheet based on first Character in a cell

/** 
* Hides rows where H = Astrisk, Unhides where H != Astrisk 
*/ 
function updateProgram() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Week 1-4"); 
    var data = sheet.getRange('H:H').getValues(); 

//iterate over all rows 
    for(var i=0; i< data.length; i++){ 
    //compare first character, if asterisk, then hide row 
    if(data[i][0].charAt(0) == '*'){ 
     sheet.hideRows(i+1); 
    } else sheet.showRows(i+1); 
    } 
} 

這是目前在所有行運行,並在一個單一的條件執行功能,並在每一行執行的功能。我曾考慮過這個可能的解決方案;

  • 如果H = * ||行顯示然後隱藏
  • 如果H!= * ||行被隱藏然後顯示
  • 否則什麼都不做

所以只有那些需要隱藏行/放映得到它。

感謝您花時間閱讀本文 - 如果您能幫助我,我將非常感謝!

UPDATE;

我想出了一種分組行的方法,顯示和隱藏了一些依賴於值的行。代碼現在看起來像這樣,需要10秒鐘才能運行。

這是我第一次自行編寫的代碼,歡迎任何反饋!

function updateProgramWeek1to4() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var s = ss.getSheetByName("Week 1-4"); 
var row = s.getRange('G:G').getValues(); 
var maxRows = s.getMaxRows(); 

s.showRows(1, maxRows); 

for(var i=0; i< row.length; i++){ 
    if(row[i] == '0'){ 
    s.hideRows(i+1, 11); 
    } 
    else if(row[i] == '1'){ 
    s.hideRows(i+3, 9); 
    } 
    else if(row[i] == '2'){ 
    s.hideRows(i+4, 8); 
    } 
    else if(row[i] == '3'){ 
    s.hideRows(i+5, 7); 
    } 
    else if(row[i] == '4'){ 
    s.hideRows(i+6, 6); 
    } 
    else if(row[i] == '5'){ 
    s.hideRows(i+7, 5); 
    } 
    else if(row[i] == '6'){ 
    s.hideRows(i+8, 4); 
    } 
    else if(row[i] == '7'){ 
    s.hideRows(i+9, 3); 
    } 
    else if(row[i] == '8'){ 
    s.hideRows(i+10, 2); 
    } 
    else if(row[i] == '9'){ 
    s.hideRows(i+11, 1); 
    } 
    else if(row[i] == '10'){ 
    s.hideRows(i+12); 
    } 
    else if(row[i] == '11'){ 
    s.hideRows(i+1); 
    } 
    } 
} 

回答

2

你可以把它用在sheet.hideRows第二PARAM快得多/ showRows它告訴它有多少處理。你需要改變你的循環並記住有多少行具有相同的狀態。當狀態改變時,你批量顯示/隱藏。

+0

謝謝 - 代碼現在已更新! – user2845885

+0

查看如何執行此操作的示例代碼:https://productforums.google.com/d/msg/docs/1qHnz9qtb18/vTKtearoBgAJ –

2

我創建了此腳本的修改版本。

HERE是演示電子表格。創建您自己的副本。它一次隱藏多達500行。這個想法與使用最少數量的紙幣支付現金類似。該腳本從表單中的列讀取數字1,5,10,50,100和500,並一次隱藏多行。每個連續行的塊分別計算。這意味着如果您希望中間的某些行可見,則在這些行之前或之後的隱藏行可以同樣快速地處理。假設您有一些可見的行,然後是63行隱藏行,然後是一些可見的行,然後是756隱藏行。 63行將按照5 + 10 + 1 + 1 + 1的順序進行處理。 756行按500 + 100 + 100 + 50 + 5 + 1分6步處理。

爲了編寫和共享代碼的初始版本,上面的用戶名爲2845885。這裏是我的修改版本:

function hideRows() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var s = ss.getSheetByName("Demo sheet"); // Enter sheet name 
var row = s.getRange('B:B').getValues(); // Enter column letter that has the numbers 500, 100, 50, 10, 5, 1 

s.showRows(1, s.getMaxRows()); 

for(var i=0; i< row.length; i++){ 
if(row[i] == '500') { s.hideRows(i+1, 500); } 
else if(row[i] == '100'){ s.hideRows(i+1, 100); } 
else if(row[i] == '50'){ s.hideRows(i+1, 50); } 
else if(row[i] == '10'){ s.hideRows(i+1, 10); } 
else if(row[i] == '5'){ s.hideRows(i+1, 5); } 
else if(row[i] == '1'){ s.hideRows(i+1, 1); } } } 

我不太瞭解編碼,但我對公式很好。然而,令人驚訝的是,編寫數字列的公式比腳本難得多。這裏是棘手的部分:假設數字列中的下一個數字是10,這意味着腳本會一次隱藏10行。這隻適用於10之後的下9行不包含任何腳本正在查找的數字。因此公式非常棘手。以下是如何創建數字列:假設列A從A2開始,它在要隱藏的行中顯示「隱藏」,而可見行爲空白。輸入此公式到單元格B2並複製下來:

=IF(OR(A2="", 
SUM($B1:INDEX(B$1:B1,IF(row()-499<1,1,row()-499)))>=500, 
SUM($B1:INDEX(B$1:B1,IF(row()-99<1,1,row()-99)))>=100, 
SUM($B1:INDEX(B$1:B1,IF(row()-49<1,1,row()-49)))>=50, 
SUM($B1:INDEX(B$1:B1,IF(row()-9<1,1,row()-9)))>=10, 
SUM($B1:INDEX(B$1:B1,IF(row()-4<1,1,row()-4)))>=5), 
"", 
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=500,500, 
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=100,100, 
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=50,50, 
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=10,10, 
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=5,5, 
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)<5,1))))))) 
相關問題