我需要根据背景颜色将行从待处理的工作表移至存档工作表。我找到了一个脚本并设法对其进行编辑以适应我的需要,除了一些我不知道的事情(除了一些基本的学校知识外,我不知道如何编码)。我的工作是这样的:
function onEdit(event) {
// assumes source data in sheet named Pendientes
// target sheet of copy to named Enviados
// getColumn with color is currently set to colu 3 or C
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if(s.getName() == "Pendientes" && r.getColumn() == 3 && r.getBackground() == "#00ff00") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Enviados");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target, {contentsOnly:true});
s.deleteRow(row);
targetSheet.getRange(targetSheet.getLastRow(), 7).setValue(new Date()).setNumberFormat("dd-mm-yy");
targetSheet.insertRowAfter(targetSheet.getLastRow())
}
}
我不知道的事情:
当您编辑单元格的内容时,脚本最初运行(背景色不起作用,花了我一段时间来弄清楚为什么它不起作用),并且当值从false更改为true时,将行移动了。 />
我想做的就是将触发器更改为我构建的自定义菜单,因此,单击触发器时,它会查找所有行,找到绿色背景的单元格并将其移至存档。因为原始脚本使用的事件会在每次进行编辑时触发该脚本,并分析那一瞬间,所以我不确定该怎么做。
我还希望单元格能够根据第2列按顺序传输,因此首先在第3列中使用OptionA在第2列中查找绿色单元格,然后将其移动,然后使用OptionB,依此类推。
我也不确定在大规模移动行时添加的用于为每行移动插入1行的行是否有效,这意味着如果移动10行将插入10条新行或1行。
我制作了一个示例纸,在其中进行了实验:
https://docs.google.com/spreadsheets/d/1tzGnuT107u1msx6BchZAEHE7NbsxIVcqXasGilQeTbA/edit?usp=sharing
谢谢!
答案 0 :(得分:1)
此功能使数据和背景色在相同范围内。在等待您解释其余问题时,请在行中的任意位置查找颜色。然后,In使用数据数组中的相应行,并在末尾推送时间戳,然后将其附加到目标表。它使用i索引删除行,并使用删除计数器d对删除的行进行计数。因为虽然从工作表中删除了行,但并未从vA或cA阵列中删除行。
function deleteRowWithGreenBackGroundAnyWhere() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getSheetByName('Penientes');
const rg=sh.getRange(3,1,sh.getLastRow()-2,sh.getLastColumn());
const vA=rg.getValues();
const cA=rg.getBackgrounds();
const tsh=ss.getSheetByName("Enviados");
const ts=Utilties.formatDate(new Date(),Session.getScriptTimeZone(),"dd-MM-yy");
var d=0;
cA.forEach(function(r,i){
r.forEach(function(c,j){
if(c=='#00ff00') {
var tA=vA[i].slice();
sh.appendRow(tA.push(ts));
sh.deleteRow(i+3-d++);
}
});
});
}