我有一张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,但结果从来都不是我想要的。 有没有人知道是否可以重新排序选定的列?如果是的话,我至少在正确的轨道上做到了吗? 感谢
答案 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()操作而不是整体粘贴数据可能会更耗时,但这可以让您更自由地选择目标列。