2014-01-15 33 views
2

現在我覺得我在這個網站上問了太多問題:),但似乎沒有人問過這個問題。如果他們這樣做,請把我鏈接到那裏。在Google電子表格中移動一列

我只想將特定列移動到同一工作表中的另一個位置(之前或之後)。我看到隱藏,插入,刪除等選項。但是,像移動一樣重要的東西,我沒有看到。

我真的必須得到列數據的範圍,然後複製它,刪除列,在我想要的地方插入列,獲取範圍,然後粘貼數據。

例子:

Col A B C D E F G H 
    1 2 3 4 5 6 7 8 
    9 10 11 12 13 14 15 16 

移到B柱之前摹說:

Col A B C D E F G H 
    1 3 4 5 6 2 7 8 
    9 11 12 13 14 10 15 16 

回答

2

下面的方法比使用SpreadsheetApp方法要快得多。除了複製/刪除/插入/粘貼操作之外,您可以一次獲取整個工作表的副本,在內存中修改,然後將修改的數據寫回。

我們從一個moveColumn()函數開始,該函數與ssurendr的答案中籤名相同。然而,它的工作只是讀取電子表格數據,將其傳遞給一個通用的JavaScript函數,然後將結果寫回表單。

/** 
* Move column in current spreadsheet 
* 
* @param {int} iniCol Source column index (1-based) 
* @param {int} finCol Destination column index (1-based) 
*/ 
function moveColumn(iniCol, finCol) { 
    var dataRange = SpreadsheetApp.getActiveSheet().getDataRange(); 
    var data = arrayMoveColumn(dataRange.getValues(), iniCol - 1, finCol - 1); 
    dataRange.setValues(data); 
} 

下一個函數arrayMoveColumn()並不特定於Google電子表格。它將移動任何二維數組中的列。 Javascript數組索引從0開始,而電子表格方法使用1-based索引。我們已經添加了一些基本的錯誤檢查,雖然它不是傻瓜。

該功能中的主力是Array.splice()方法,該方法用於刪除和插入數組中的元素。

/** 
* Move content of a "column" in a 2-d Array. 
* 
* @param {array} data Two-dimensional matrix (array with no null values) 
*      Array content is changed by this function. 
* @param {int} from Source column index (0-based) 
* @param {int} to Destination column index (0-based) 
* 
* @return {array}  Resulting array (for chaining) 
*/ 
function arrayMoveColumn(data, from, to) { 
    // Parameter error checking 
    if (!(data instanceof Array && data[0] instanceof Array)) throw new TypeError('need 2d array'); 
    if (from >= data[0].length || to >= data[0].length) throw new Error('index out of bounds'); 

    for (var row=0; row<data.length; row++) { 
    var temp = data[row].splice(from, 1); // take 'from' 
    data[row].splice(to, 0, temp[0]);  // put 'to' 
    } 
    return data; 
} 
+0

不錯,我喜歡這個。與我的相比,它會減少計算時間。 – ssurendr

2

我想有這樣做,除了像我前面說的沒有別的辦法。這是我所做的一個功能,如果有些人要求同樣的事情需要它。你可以很容易地修改這個來移動行。我是Apps Script的新手,因此可能會有比這更簡單的代碼。

function moveColumn(iniCol, finCol) { 
    // iniCol - Column of interest. (Integer) 
    // finCol - Column where you move your initial column in front of.(Integer) 
    // Ex: 
    // Col A B C D E 
    //  1 2 3 4 5 
    //  6 7 8 9 10 
    //  11 12 13 14 
    // Want to move Column B in between Column D/E. 
    // moveColumn(2,4); 
    // Col A B C D E 
    //  1 3 4 2 5 
    //  6 8 9 7 10 
    //  11 12 13 14 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sh = ss.getActiveSheet(); 
    var lRow = sh.getMaxRows(); 
    if (finCol > iniCol) { 
    sh.insertColumnAfter(finCol); 
    var iniRange = sh.getRange(1, iniCol, lRow); 
    var finRange = sh.getRange(1, finCol + 1, lRow); 
    iniRange.copyTo(finRange, {contentsOnly:true}); 
    sh.deleteColumn(iniCol); 
    } 
    else { 
    sh.insertColumnAfter(finCol); 
    var iniRange = sh.getRange(1, iniCol + 1, lRow); 
    var finRange = sh.getRange(1, finCol + 1, lRow); 
    iniRange.copyTo(finRange, {contentsOnly:true}); 
    sh.deleteColumn(iniCol + 1);  
    } 
} 

我想,最好什麼我們可以在谷歌電子表格做在前臺可以programmaticly完成。 (如移動一列或一列)

0

如果有人想取代兩列:(感謝@ssurendr爲基礎)

function replaceColumn(Col1, Col2) { 
// Ex: 
// Col A B C D E 
//  1 2 3 4 5 
//  6 7 8 9 10 
//  11 12 13 14 
// Want to replace Column B & D. 
// moveColumn(2,4); 
// Col A D C B E 
//  1 4 3 2 5 
//  6 9 8 7 10 
//  11 13 12 14 
if (Col2 > Col1) { 
    sh.insertColumnAfter(Col1); 
    var iniAftRa = sh.getRange(1, Col2+1, lRow); 
    var finRange = sh.getRange(1, Col1, lRow); 
    var finColAftRange = sh.getRange(1, Col1+1, lRow); 
    finRange.copyTo(finColAftRange, {contentsOnly:true}); 
    iniAftRa.copyTo(finRange, {contentrsOnly:true}); 
    finColAftRange.copyTo(iniAftRa, {contentrsOnly:true}); 
    sh.deleteColumn(Col1 + 1); 
} else { 
    sh.insertColumnAfter(Col2); 
    var iniAftRa = sh.getRange(1, Col1+1, lRow); 
    var finRange = sh.getRange(1, Col2, lRow); 
    var finColAftRange = sh.getRange(1, Col2+1, lRow); 
    finRange.copyTo(finColAftRange, {contentsOnly:true}); 
    iniAftRa.copyTo(finRange, {contentrsOnly:true}); 
    finColAftRange.copyTo(iniAftRa, {contentrsOnly:true}); 
    sh.deleteColumn(Col2 + 1);  
} 
} 
相關問題