这是一种比使用 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;
}