使用谷歌脚本重新排列电子表格。我首先对它进行排序,然后将范围内的一些行移动到工作表的末尾。每次我执行moveTo函数时,一些引用移动行的单元格会被更改以反映新的行号,即使单元格超出了我的范围而且不应该被修改。例如,如果im移动单元格b3并且我具有单元格f4 = b3那么当我移动b3单元格时f4变为b3现在是什么。我尝试用= b $ 3锁定它但仍然无法正常工作。此外,它还会使用类似" d2:e"的内容混淆整个列的条件格式。它变成了像#34; d2:e109"或类似的东西。有什么线索在发生吗?
function onEdit(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var allowedSheet = 1;
if(sheet.getIndex() == allowedSheet) {
var editedCell = sheet.getActiveCell();
var sortBy = [1, 3, 2];
var triggerCol = [1,2,3,10,11,12];
var rangeStart = "A";
var rangeEnd = "E";
var tableRange = "A2:E";
if(triggerCol.indexOf(editedCell.getColumn()) > -1) {
var range = sheet.getRange(tableRange);
range.sort([{column: sortBy[0], ascending: true}, {column: sortBy[1], ascending: false}, {column: sortBy[2], ascending: true}]);
var indexOfIncome = find( sheet, 2, "Income");
if( indexOfIncome > 0 ){
var overflowRange = sheet.getRange("A2:E" + (indexOfIncome - 1 ));
var lastRow = findFirstEmptyCell( sheet, 1 );
overflowRange.moveTo(sheet.getRange("A" + ( lastRow )));
var fullRange = sheet.getRange(rangeStart + indexOfIncome + ":" + rangeEnd);
fullRange.moveTo(sheet.getRange(rangeStart + "2"));
}
}
}
}
function find( sheet, column, value ) {
var data = sheet.getRange(1, column, sheet.getMaxRows()).getValues();
for( i = 0; i < sheet.getMaxRows(); i++ ){
if (data[i][0].toString().indexOf(value) > -1 ) {
return i + 1;
}
}
return 0;
}
function findFirstEmptyCell ( sheet, column ){
var data = sheet.getRange( 1, column, sheet.getMaxRows() ).getValues();
for( i = 0; i < sheet.getMaxRows() ; i++ ){
if( data[i][0] == "" ){
return i + 1;
}
}
return 0;
}
答案 0 :(得分:0)
这是预期的行为,moveTo
就像剪切(Ctrl + X)一样,而您正在寻找复制+粘贴,然后删除与copyTo(newRange)
关联的原始内容clear(oldRange)
答案 1 :(得分:0)
我通过使用副本然后清除它来工作。现在为什么谷歌会让一个单一的功能与所有其他功能完全相反的功能超出我的范围。文档说moveto表现为剪切和粘贴,但当我剪切和粘贴时,我不会弄乱我的其余部分。