我在电子表格上有多个工作表,跟踪多个人都可以访问的类似数据。在某些时候,我们隐藏行/列以跟踪特定值(例如:所有库存被发送到X位置或什么库存在Y卡车上)。但是这样做意味着停止其他人的工作,所以我希望添加一个新的工作表的电子表格中有一个子集的数据之间的所有工作表。我们已经有了一个布尔值,它将标记哪些行应该与这个新工作表相关。所以我希望脚本做的是当这个布尔值设置为TRUE时,它会将该行复制到新工作表。然而,并不是该行上的所有数据都是相关的,所以我也希望只复制该行所需的列。例如:当行1921上的布尔值设置为true时,对于行1921,将列A、B、C、F、G、I、K、M复制到新工作表。
我是JavaScript和google sheets的新手,所以我很挣扎。
这是到目前为止我想出的代码,只是尝试将整行复制到新工作表。
function onEdit(e){
const sh = e.range.getSheet();
if((sh.getName() == "ScriptTestingSource"/*add OR statements to include other sheets*/) &&
e.range.columnStart==18 && e.range.rowStart == 2 && e.value == "TRUE"){
let spreadSheet = SpreadsheetApp.getActive();
let sourceSheet = SpreadsheetApp.getActiveSheet();
let targetSheet = spreadSheet.getSheetByName("ScriptTestingTarget")
targetSheet.insertRows(2,1);
let sourceRange = sourceSheet.getDataRange();
let sourceValues = sourceRange.getValues();
let sourceRow = e.range.getRow();
let sourceColumns = sourceValues[sourceRow].length;
let targetRange = targetSheet.getRange(2,1,1,sourceColumns);
targetRange.setValues(sourceValues[sourceRow-1]);
}
}
我认为问题在于我的targetRange值。
在复制特定列时,我认为应该能够从sourceValues中删除不需要的值,并限制targetRange的列以匹配长度。
最后,我担心使用整个数据范围和值,因为工作表相当大,所以如果可能的话,我希望只从源工作表中获取相关范围。
编辑:更新代码
function onEdit(e){
const sh = e.range.getSheet();
if((sh.getName() == "ScriptTestingSource") &&
e.range.columnStart==18 && e.range.rowStart >= 2 && e.value == "TRUE"){
let spreadSheet = SpreadsheetApp.getActive();
let sourceSheet = SpreadsheetApp.getActiveSheet();
let targetSheet = spreadSheet.getSheetByName('ScriptTestingTarget')
targetSheet.insertRows(2,1);
let sourceRow = e.range.getRow();
let sourceRange = sourceSheet.getRange(sourceRow,1,1,11);
let sourceValues = sourceRange.getValues();
sourceValues[0].splice(7,1)
sourceValues[0].splice(3,2)
sourceValues[0].splice(0,1)
let targetRange = targetSheet.getRange(2,1,1,7);
targetRange.setValues(sourceValues);
}
}
我修好了!但现在我很好奇,有没有快速找到最后一排的方法?
FINALEDIT:现在它在目标工作表中找到最后一行,在后面插入一个新行,然后插入数据
function onEdit(e){
const sh = e.range.getSheet();
if((sh.getName() == "ScriptTestingSource") &&
e.range.columnStart==18 && e.range.rowStart >= 2 && e.value == "TRUE"){
//get source and target sheets
let spreadSheet = SpreadsheetApp.getActive();
let sourceSheet = SpreadsheetApp.getActiveSheet();
let targetSheet = SpreadSheet.getSheetByName('ScriptTestingTarget')
//get row where edit occurs
let sourceRow = e.range.getRow();
//get data range of edited row
let sourceRange = sourceSheet.getRange(sourceRow,1,1,11);
//get values of the edited row
let sourceValues = sourceRange.getValues();
//splice off unneeded values
sourceValues[0].splice(7,1)
sourceValues[0].splice(3,2)
sourceValues[0].splice(0,1)
//insert new row on on target sheet
let targetRows = targetSheet.getDataRange().getNumRows()
targetSheet.insertRowsAfter(targetRows,1);
//get range of target sheet, the newly created row
let targetRange = targetSheet.getRange(targetRows+1,1,1,7);
//insert values to new row
targetRange.setValues(sourceValues);
}
}
1条答案
按热度按时间falq053o1#
推荐:
选中复选框时,将源工作表中的行中的单元格子集复制到目标工作表。
输入示例:
输出示例:
**注意:**数组索引从[0]开始。在上面的示例中,
splice(3,1)
是指City列。请根据您的数据更改第一个
if
语句上的行和列。参考: