2014-11-03 77 views
2

我寫一個腳本,將在谷歌電子表格規範化選定號碼:如何通過不同的控制選擇單元循環?

/** 
* Normalizes phone numbers to ###-###-#### format. 
*/ 
function normalizePhoneNumbers() { 
    var activeSheet = SpreadsheetApp.getActiveSheet(); 
    var activeRange = activeSheet.getActiveRange(); 
    var selectedCells = activeRange.getValues(); 

    var phoneNumber = ""; 

    for (var i = 0; i < selectedCells.length; i++) { 
    for (var j = 0; j < selectedCells[i].length; j++) { 
     phoneNumber = selectedCells[i][j]; // for better readability 

     if (phoneNumber) { 
     phoneNumber = phoneNumber.replace(/[^\d]/g, ""); // remove all non-digit characters from phone number 
     } else { 
     continue; 
     } 

     if (phoneNumber.length === 10) { 
     phoneNumber = phoneNumber.slice(0, 3) + '-' + phoneNumber.slice(3, 6) + '-' + phoneNumber.slice(6, 10); 
     } else { 
     continue; 
     } 

     selectedCells[i][j] = phoneNumber; 
    } 
    } 

    activeRange.setValues(selectedCells); 
}; 

這工作時,我選擇行或列或單元塊,但只是改變了項目如果一個我控制 - 選擇分散在電子表格中的單元格。是否可以在非連續選擇中更改多個單元格?如果是這樣,我做錯了什麼?

回答

0

你想要做的不是完全可能的。例如,activerange.setValues()需要一個單一的二維數組(如Range.getValues()返回的內容)。在這兩種情況下,你的函數只能得到一個單一的矩形數據陣列,而不是一組不相交的單元格,如果你叫getValues()。但是,如果您可以處理使其成爲在電子表格中調用的自定義函數(使用類似=NORMALIZEPHONENUMBERS的東西),那麼您可以使用map(),如在自定義函數文檔中的Optimization中所演示的。

+0

我實際上是通過自定義函數方法開始的,但後來我意識到我將不得不在一個單元中調用該函數,而是從另一個單元格引用電話號碼:-p。我只是想讓這些數字正常化,所以這就是爲什麼我改變了自定義函數的原因。 – user4212284 2014-11-04 08:13:49

+0

也許一個理智的方式來處理這個問題,然後,將會突出顯示包含您要格式化的電話號碼的**整個**區域,並且有一個正則表達式,它將逐個單元格地確定是否存在它知道如何改變的數字。 – jjjjoe 2014-11-04 15:26:06

+0

雅,我認爲這就是我的代碼現在試圖做的,除非你看到我失蹤的東西。所以我得到控制選擇的單元並不是必須的,它只是會很好:-p。 – user4212284 2014-11-04 20:13:55

相關問題