2012-10-02 138 views
1

我有一張電子表格,當我處理文檔時,我想多次排列多列。這是一個使用GUI的多步驟過程,看起來太耗時。我必須檢查標題行的框,設置第一個排序參數,然後再添加一個。唷!它變得很快。Google Apps腳本:在腳本中排序時可以指定標題行嗎?

排序表是沒有問題的,但標題行也排序!我沒有找到任何方法來指定我有一個標題行作爲sort()函數的參數,我也沒有看到任何方法來全局定義將被sort()自動注意到的標題行。

取而代之,我保存了標題行,刪除了第一行,對錶單進行排序,在最上面插入了一個新行,重新創建了標題行,並格式化了標題行。哇!編寫並不需要很長時間,它運行良好,但它非常複雜!

從用戶角度來看,標題行在彈出備份之前會短暫消失。這並不是太糟糕,但顯然有些事情正在發生。

因此,最後我解決了我的問題:我在排序時忽略了承認標題行存在的能力嗎?或者,排序帶有腳本中的標題行的工作表是否也對標題行進行排序,而沒有追索權?

如果我的方法或類似方法需要避免在排序過程中包含標題行,是否有某處我可以通知Google Apps團隊,以便他們可以考慮添加此功能?由於使用簡單的複選框指定存在標題行的存在,我希望它存在或可以在腳本中排序時添加。

編輯

我的原代碼(與文檔/註釋去掉):

sheet.deleteRow(1); 

rows.sort([<1st col>, <2nd col>]); 

sheet.insertRowsBefore(1, 1); 
for (var j = 0; j <= (numCols - 1); j++) { 
    sheet.getRange(1, (j + 1)).setValue(firstRow[j]); 
} 

sheet.getRange(1, 1, 1, numCols).setFontWeight("bold"); 
sheet.getRange(1, 1, 2, numCols).setBorder(true, true, true, true, true, true); 

我在的地方,上面的代碼感謝已經試過了托馬斯的建議:

sheet.setFrozenRows(1); 
sheet.sort(<2nd col>); 
sheet.sort(<1st col>); 
sheet.setFrozenRows(0); 

不幸的是,這只是按列而不是按行排序。用第一個代碼塊中的rows.short();行代替2 sheet.sort();調用不起作用。嘗試這樣會導致我在我的評論中報告的最初問題,其中標題行與其他數據一起排序,即使第一行在排序之前被凍結。

此外,除非在此之下添加另一行代碼,否則我將在電子表格的頂部獲得永久「正在工作...」通知。但是,它似乎並沒有影響任何東西。

在所有情況下,var sheet = SpreadsheetApp.getActiveSheet();,var rows = sheet.getDataRange();firstRow是標題行數據的數組。

回答

5

在所有情況下,無功表= SpreadsheetApp.getActiveSheet(); VAR行= sheet.getDataRange( );, firstRow是標題行 數據的數組。

而不是使用getDataRange(),你可以得到你要排序的範圍(即不包括標題行):

var sheet = SpreadsheetApp.getActiveSheet(); 
var rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); 

這接下來的部分是一個回答/觀察「次要」問題:

腳本結束後,標題行與所有一起排序其他行儘管第一行被凍結。

我覺得這是一個有點氣體的限制,其中有些「表格工具」的方法沒有發揮好彼此的 - this issue是不一樣的你的,但我認爲這是(種)有關。

因此,對於「凍結標題」解決方法,我會很有興趣看看SpreadsheetApp.flush();是否在sheet.setFrozenRows(1);之後插入。

+0

SpreadsheetApp。flush()確實是一個有趣的想法;-)我想你的建議會導致考慮在數組上進行排序而不是在表單本身上......它可能會更有效率,你不覺得嗎? –

+0

噢,肯定是嗶嘰,我應該明確表示,我的答案的第一部分是我的一個「正確的」答案,第二部分是對第二個問題的答案。 – AdamL

+0

呃!只需排除我排序的行中的第一行。它的工作原理很明顯,理解和維護起來更簡單。它似乎運行緩慢,但我懷疑這是運行排序方法的功能(手動設置排序需要相當長的時間)。謝謝!我將此標記爲答案。順便說一句,添加'SpreadsheetApp.flush();'沒有幫助。但是,謝謝你的偉大建議! – evanshultz

2

你想這樣做:

,然後調用這個腳本:

function myFunction() { 
    SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().sort(1); 
} 

還有你去:)

隨着親切的問候,

托馬斯麪包車Latum

+0

謝謝!我在'rows.sort([,<2nd col>]);'之前加了'sheet.setFrozenRows(1);',但它不起作用。腳本完成後,標題行與所有其他行一起排序,儘管第一行被凍結。使用Undo命令,我發現標題行在排序之前被凍結,但它仍然與所有其他行一起排序。因此最終排序數據中的第一行被凍結。如果我註釋掉排序的行,在腳本結尾標題行被正確凍結。我可以做些什麼來防止凍結行作爲第一行? – evanshultz

+0

如果按照您的指示按照您的指示凍結第一排,那是手動操作。我不能接受這個解決方案。腳本的重點是自動化任務並消除手動干預。另外'SpreadsheetApp.getActiveSpreadsheet()。getActiveSheet()。sort(1);'將按列排序整個工作表,這在我的情況下不起作用,因爲我在每一行數據中都有多列,而且我需要對整個行(但我不是非常清楚這一點!)。 – evanshultz

+0

這個工作正常使用'sheet.setFrozenRows(1);'凍結第一行。不需要手動干預。 – am2124429