【问题标题】:Moving a column in Google Spreadsheet在 Google 电子表格中移动列
【发布时间】:2014-01-15 18:08:57
【问题描述】:

现在我觉得我在这个网站上问了太多问题:),但似乎没有人问过这个问题。如果他们这样做了,请在此处链接我。

我只想将特定列移动到同一张工作表中的另一个位置(在另一列之前或之后)。我看到了隐藏、插入、删除等选项。但是像移动这样基本的东西,我看不到。

我真的必须获取列数据的范围然后复制它,删除列,在我想要的位置插入一列,获取范围,然后粘贴数据..?

例子:

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

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案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() 并不特定于 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;
    }
    

    【讨论】:

    • 我的解决方案有一些问题:公式被值替换,并且在参数错误检查中的某些工作表上抛出错误
    【解决方案2】:

    我想除了像我之前说的那样做之外别无他法。这是我做的一个功能,如果有些人来要求同样的事情需要它。您也可以轻松地对其进行修改以移动行。我是 Apps 脚本的新手,所以可能有比这更简单的代码。

    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);    
      }
    }
    

    我认为理想情况下,我们可以在前端的谷歌电子表格中做的任何事情都可以通过编程方式完成。 (就像移动一列或一行。)

    【讨论】:

      【解决方案3】:

      如果有人想替换两列:(感谢@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);    
      }
      }
      

      【讨论】:

        【解决方案4】:

        未来的新闻!! 你只需要使用moveColumns(columnSpec, destinationIndex)

        https://developers.google.com/apps-script/reference/spreadsheet/sheet#movecolumnscolumnspec,-destinationindex

        【讨论】:

          猜你喜欢
          • 2020-05-21
          • 2013-04-16
          • 2017-08-13
          • 2015-08-09
          • 2018-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多