谷歌脚本将行移动到另一个重新排序列的电子表格

时间:2016-07-08 15:52:15

标签: google-apps-script

我有一张4张Google表格工作簿。 “Main”表格会自动将数据转储到前11列中。第12列设置为手动移动触发器,用于将每行的选定列数据移动到目标工作表(其他3个工作表之一)。我只能将我想要的列移动到选定的目标工作表,例如第1,4,9和10列。但这些是在数据移动时在目标工作表中填充的列。我希望数据移动到目标工作表的前4列。我搜索了很多论坛,但是如果有可能的话就找不到。这是我目前的剧本:

function onEdit() {

  // base definitions
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var editedSheet = ss.getActiveSheet();
  var editedCell = editedSheet.getActiveCell();
  var wordInCell = editedCell.getValue().toString();
  var moveSheet = "Main";
  var moveColumn = 12;
  var moveWords = ["move5x", "move6x", "moveas"];
  var targetSheets = ["5x", "6x", "Assigned"];

  // if the edit was mot in the moveSheet jump out
  var sheetIndex = moveSheet.indexOf(editedSheet.getName());
  if (sheetIndex == -1) return;

  // if the edit was mot in the move column jump out
  if (editedCell.getColumn() != moveColumn) return;

  // if the value in editedCell isn't one of the move words, jump out 
  var moveWordsIndex = moveWords.indexOf(wordInCell);
  if (moveWordsIndex == -1) return;

  // if the value in editedCell is one of the move words, set up columnsToMove
  var columnsToMove;
  if (moveWordsIndex == 0 || moveWordsIndex == 1) {columnsToMove = [[1, 4], [8, 8]]};
  if (moveWordsIndex == 2) {columnsToMove = [[1, 1], [4, 4], [9, 10]]};

  // copy data from editedSheet's sourceRow to targetSheet's targetRow
  var sourceRow = editedCell.getRow();
  var targetSheet = ss.getSheetByName(targetSheets[moveWordsIndex]);
  var targetRow = targetSheet.getLastRow();
  targetSheet.insertRowAfter(targetRow++);
  for (var i = 0; i < columnsToMove.length; i++) {
    var startColumn = columnsToMove[i][0];
    var numColumns = columnsToMove[i][1] - startColumn + 1;
    var numCopiedColumns = columnsToMove.length;
    var rangeToCopyFrom = editedSheet.getRange(sourceRow, startColumn, 1, numColumns);
    var rangeToCopyTo = targetSheet.getRange(targetRow, startColumn, 1, numColumns);
    rangeToCopyFrom.copyTo(rangeToCopyTo);
  }
}

我已经尝试过以我能想到的每一种方式操作rangeToCopy,但结果从来都不是我想要的。 有没有人知道是否可以重新排序选定的列?如果是的话,我至少在正确的轨道上做到了吗? 感谢

1 个答案:

答案 0 :(得分:0)

为什么不将目标范围的起始列设置为1?

var rangeToCopyTo = targetSheet.getRange(targetRow, 1, 1, numColumns);

如果我找对你,它应该可以解决问题。 您也可以使用.getValues().setValues()以非常类似的方式工作。

还有一种方法可以使用单独的.setValue()函数:

 for (var i = 0; i < columnsToMove.length; i++) {
    var startColumn = columnsToMove[i][0];
    var numColumns = columnsToMove[i][1] - startColumn + 1;
    var numCopiedColumns = columnsToMove.length;
    var rangeToCopyFrom = editedSheet.getRange(sourceRow, startColumn, 1, numColumns).getValues(); 
    for (var i = 0; i < numCopiedColumns; i++) {
       //here you insert your values into first 'numCopiedColumns' columns in the targetRow
        targetSheet.getRange(targetRow, i + 1).setValue(rangeToCopyFrom[i]); 
    }
 }

对于每个单独的值执行.setValue()操作而不是整体粘贴数据可能会更耗时,但这可以让您更自由地选择目标列。