sorting - 如何优化 Google Sheet 的排序/时间戳脚本
问题描述
我对 Google Sheets 中的脚本还是很陌生,我想我在这里构建的东西不是很优化.. 但它可以工作(在大多数情况下)。
我的目标是有一个脚本(onEdit),它会自动在 R 列中添加时间戳(对于来自新截止日期/新的非截止日期的任务),并根据 G 列中设置的状态对任务进行排序(已完成,升级到柏林或请求的数据) 将我的电子表格添加到相应的选项卡中。
问题是脚本有时没有反应,所以任务没有移动,也没有添加时间戳。我假设,因为很多人同时触发脚本。
我目前在一个项目中有以下所述的脚本。我能做些什么来改进它并让它运行得更顺畅吗?
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
//--------------------------------------------------------------------------------------------------------//
//NEW DEADLINES -- START
if(s.getName() == "New Deadlines" && r.getColumn() == 7 && r.getValue() == "Completed")
{
var nextCell = r.offset(0, 11);
nextCell.setValue(new Date());
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Completed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
if(s.getName() == "New Deadlines" && r.getColumn() == 7 && r.getValue() == "Escalation to Berlin")
{
var nextCell = r.offset(0, 11);
nextCell.setValue(new Date());
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Escalation to Berlin");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
if(s.getName() == "New Deadlines" && r.getColumn() == 7 && r.getValue() == "Requested Data")
{
var nextCell = r.offset(0, 11);
nextCell.setValue(new Date());
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Requested Data");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
//SORTING NEW DEADLINES END
//NEW DEADLINES -- END
//--------------------------------------------------------------------------------------------------------//
//NEW NON DEADLINES -- START
if(s.getName() == "New None-Deadlines" && r.getColumn() == 7 && r.getValue() == "Completed")
{
var nextCell = r.offset(0, 11);
nextCell.setValue(new Date());
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Completed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
if(s.getName() == "New None-Deadlines" && r.getColumn() == 7 && r.getValue() == "Escalation to Berlin")
{
var nextCell = r.offset(0, 11);
nextCell.setValue(new Date());
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Escalation to Berlin");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
if(s.getName() == "New None-Deadlines" && r.getColumn() == 7 && r.getValue() == "Requested Data")
{
var nextCell = r.offset(0, 11);
nextCell.setValue(new Date());
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Requested Data");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
//NEW NON DEADLINES -- END
//--------------------------------------------------------------------------------------------------------//
//SORTING COMPLETED -- START
if(s.getName() == "Completed" && r.getColumn() == 7 && r.getValue() == "Escalation to Berlin")
{
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Escalation to Berlin");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
if(s.getName() == "Completed" && r.getColumn() == 7 && r.getValue() == "Requested Data")
{
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Requested Data");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
//SORTING COMPLETED -- END
//--------------------------------------------------------------------------------------------------------//
//SORTING ESCALATION TO BERLIN -- START
if(s.getName() == "Escalation to Berlin" && r.getColumn() == 7 && r.getValue() == "Completed")
{
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Completed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
if(s.getName() == "Escalation to Berlin" && r.getColumn() == 7 && r.getValue() == "Requested Data")
{
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Requested Data");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
//SORTING ESCALATION TO BERLIN -- END
//--------------------------------------------------------------------------------------------------------//
//SORTING Requested Data -- START
if(s.getName() == "Requested Data" && r.getColumn() == 7 && r.getValue() == "Completed")
{
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Completed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
if(s.getName() == "Requested Data" && r.getColumn() == 7 && r.getValue() == "Escalation To Berlin")
{
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Escalation To Berlin");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
//s.deleteRow(row);
}
//SORTING Requested Data *New -- END
//--------------------------------------------------------------------------------------------------------//
}
解决方案
我没有对此进行测试,但这样的事情应该可以工作:
function onEdit(e) {
e.source.toast('entry');//debug
const tshts = ["Completed", "Escalation to Berlin", "Requested Data"];
const sh = e.range.getSheet();
const idx = tshts.indexOf(e.value);
if (sh.getName() == "New Deadlines" && e.range.columnStart == 7 && ~idx) {
e.source.toast('flag1');//dubug
e.range.offset(0, 11).setValue(new Date());
const tsh = e.source.getSheetByName(tshts[idx]);
const tgt = tsh.getRange(tsh.getLastRow() + 1, 1);
sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn()).moveTo(tgt);
}
}
推荐阅读
- elasticsearch - 如何使用 top_hits 中的字段对顶级存储桶进行排序
- amazon-web-services - 如何更新 DynamoDB 中的嵌套字段?
- html - CSS:当父级使用最大高度而不是高度时,可滚动子内容失败
- postgresql - 如何在 tokio_postgres 中为查询语句传递多个参数?
- go - 如何在 H3 库中找到给定半径(Km)的基本单元的邻居索引/单元
- python - Python问题中的解密脚本
- windows - 尝试创建脚本以更改 Plantronics 集线器上的设置
- wordpress - 使用 CF7 Wordpress 表单在选择选项中插入值
- excel - 关于 VLookUp 的查询
- php - 如何为 PHP 中的每个项目关联特定的数组键值?