【发布时间】:2018-05-12 06:23:25
【问题描述】:
我有一个脚本,它查看一个工作表(“数据”)并从一列日期中找到未来 3 个月的日期,并将这些行复制到另一个工作表(“3 个月”)中。它可以做到,耶!
我还希望它在“3 个月”表上检查每一行的唯一 ID,如果该唯一 ID 存在,则不要从“数据”复制该行。
它会这样做,但前提是“3 Months”中的数据与“Data”中的数据顺序相同,否则不会。显然,它所做的是将当前唯一 ID 与数组中的等效唯一 ID 匹配。而不是尝试将当前唯一 ID 与数组中的所有 ID 匹配,并确保它不匹配其中任何一个。
这就是我所拥有的:
function contractSearch2() {
//Get all the sheet names as variables
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data");
var threeMonths = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("3 Months");
//Get all the expiry dates on the data sheet
var lastRow = dataSheet.getLastRow();
var endDates = dataSheet.getRange(1, 11, lastRow).getValues();
//Get today's date
var today = new Date();
// Work out when 3 months from now is.
var threeMonthsOut = new Date(today);
var CurrentDate = new Date();
threeMonthsOut.setMonth(CurrentDate.getMonth() + 3);
// Find months / years that match 3 months out.
var threeMonthslastRow = threeMonths.getLastRow();
var CallOffIDs = threeMonths.getRange(1, 4, threeMonthslastRow+1, 1).getValues();
var test = 0
var j = 0;
//Logger.log(CallOffIDs[1])
for (var i = 0; i < endDates.length; i++){
var fDate = new Date(endDates[i][0]);
// if a date is 3 months in the future
if (fDate.getMonth() == threeMonthsOut.getMonth() &&
fDate.getFullYear() == threeMonthsOut.getFullYear()) {
//get all the row info
var entry = dataSheet.getRange(i+1, 1, 1, 44).getValues();
// Check to see if CallOff ID Exists already
// Get the CallOff ID from the entry row
var CallOffCheck = entry[0][3];
++j;
for ( test in CallOffIDs) {
++test;
if (CallOffCheck == CallOffIDs[j]) {
break;
} else {
var threeMonthslastRow2 = threeMonths.getLastRow();
threeMonths.getRange(threeMonthslastRow2 + 1, 1, 1, 44).setValues(entry);
break;
}
}
}
}
}
由于另一个原因我需要对“3 个月”上的行重新排序,并且“数据”表上的数据总是在更新,所以我需要不断地运行脚本。这就是为什么我需要它来检查所有值。
提前致谢。
【问题讨论】:
-
如果您有很多行要与每一行进行比较,请考虑对对象中的唯一 ID 进行散列处理,因为您只需检查该对象属性是否存在。例如,查看我最近的回答:stackoverflow.com/a/50286994/9337071
-
嘿,丹。你到底在哪里搜索?我似乎无法理解您的代码。此外,就像上面提到的 tehhowch,如果它是一个大数组,请考虑创建一个唯一的 ID 映射以帮助加快搜索查找速度。
-
您的检查循环中确实出现了一些奇怪的索引模式,以及一些未使用的变量。我建议重写方法,首先用伪代码写在纸上,这样你就可以在实施之前获得详细信息。
标签: javascript google-apps-script