Javascript 在Google电子表格中移动列
现在我觉得我在这个网站上问的问题太多了:),但似乎没有人问过这个问题。如果有,请联系我 我只想将一个特定列移动到同一工作表中的另一个位置(在另一列之前或之后)。我看到了隐藏、插入、删除等选项,但像移动这样基本的东西我看不到 我真的需要获取列数据的范围,然后复制它,删除列,在我想要的位置插入列,获取范围,然后粘贴数据 例如:Javascript 在Google电子表格中移动列,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,现在我觉得我在这个网站上问的问题太多了:),但似乎没有人问过这个问题。如果有,请联系我 我只想将一个特定列移动到同一工作表中的另一个位置(在另一列之前或之后)。我看到了隐藏、插入、删除等选项,但像移动这样基本的东西我看不到 我真的需要获取列数据的范围,然后复制它,删除列,在我想要的位置插入列,获取范围,然后粘贴数据 例如: 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 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
将B列移到G之前,说:
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
我想除了像我前面说的那样去做,没有别的办法了。这是我做的一个函数,如果有人来要求同样的东西,需要它。您可以很容易地修改它来移动行。我不熟悉应用程序脚本,所以可能有比这更简单的代码
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);
}
}
我认为,理想情况下,我们可以在前端的谷歌电子表格中做的任何事情都可以通过编程来完成。(比如移动一列或一行。)这里有一种比使用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()
,不是谷歌电子表格特有的。它将移动任何二维数组中的列。Javascript数组从0
开始编制索引,而电子表格方法使用基于1的
索引。我们添加了一些基本的错误检查,尽管它不是傻瓜式的
此函数的主要功能是方法,用于在数组中删除和插入元素
/**
* 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;
}
/**
*在二维数组中移动“列”的内容。
*
*@param{array}data二维矩阵(无空值的数组)
*此函数可更改数组内容。
*@param{int}来自源列索引(基于0)
*@param{int}到目标列索引(基于0)
*
*@return{array}结果数组(用于链接)
*/
函数arrayMoveColumn(数据、从、到){
//参数错误检查
如果(!(数组的数据实例和数组的数据[0]实例))抛出新的TypeError('need 2d Array');
如果(从>=数据[0].length | |到>=数据[0].length)抛出新错误(“索引超出范围”);
对于(var row=0;row如果有人想替换两列:(感谢@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);
}
}