下面的方法比使用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;
}
不錯,我喜歡這個。與我的相比,它會減少計算時間。 – ssurendr