javascript - 根据其他工作表的值/验证检查 ID 复选框
问题描述
这是包含应用程序脚本的示例表: https ://docs.google.com/spreadsheets/d/1AOzYMVqOqww4bUfSigDWz6gL6tmESfQxuKw4auNS4kU/edit?usp=sharing
我有一个主列表,用于跟踪是否发送了交易信函。应该在交易日期之后发送 3 封信 - 初始交易日期后的第 1、第 3 和第 6 个月,因此每个 ID 有 3 个复选框。如果发送了一封信,现在我会根据信函月份手动选中一个复选框。我创建了第二张表,它将显示每个未检查的 ID 的所有最早日期,并且该日期早于单元格 B2 上的日期。我的目标是当我运行脚本时,它将检查客户 ID 和日期匹配的所有相应复选框。
这是我当前的应用程序脚本代码:
function myFunction() {
var sh1 = Sheets.Spreadsheets.Values.get('1AOzYMVqOqww4bUfSigDWz6gL6tmESfQxuKw4auNS4kU','Payment Due by Date!A4:D');
var sh2 = Sheets.Spreadsheets.Values.get('1AOzYMVqOqww4bUfSigDWz6gL6tmESfQxuKw4auNS4kU','Master List!A2:K');
for(var i = 0; i < sh1.values.length; i++){
var sh1Id = sh1.values[i][0]; //sheet1 ID
var sh1DD = sh1.values[i][2]; //sheet1 date
for(var j = 0; j < sh2.values.length; j++){
var sh2Id = sh2.values[j][0]; //sheet2 ID
var sh2m1d = sh2.values[j][3]; //sheet2 month1 date
var sh2m1c = sh2.values[j][4]; //sheet2 month1 checkbox
var sh2m3d = sh2.values[j][5]; //sheet2 month3 date
var sh2m3c = sh2.values[j][6]; //sheet2 month3 checkbox
var sh2m6d = sh2.values[j][7]; //sheet2 month6 date
var sh2m6c = sh2.values[j][8]; //sheet2 month6 checkbox
//Logger.log(sh2m1c);
//compare the ID & month and check the corresponding checkbox
if(sh1Id == sh2Id && sh1DD == sh2m1d)
sh2m1c = "TRUE";
else if(sh1Id == sh2Id && sh1DD == sh2m3d)
sh2m3c = "TRUE";
else if(sh1Id == sh2Id && sh1DD == sh2m6d)
sh2m6c = "TRUE";
}
}
}
当我检查记录器时,我认为循环是获取值(如果我错了,请纠正我)。我不知道我的循环是否运行错误,或者我检查复选框的方式是否错误。
编辑:我的工作表中的一个具体例子是我想要做什么:
如果在付款到期日此行存在
客户ID | 顾客姓名 | 付款截止日期 | 到期付款 |
---|---|---|---|
1042 | 汤姆,C | 2020 年 6 月 5 日 | 第六个月到期 |
当脚本运行时,我希望选中主列表中 6th Mo Due 下的 ID 1042 复选框。
客户ID | 顾客姓名 | 交易日期 | 第一个月到期 | 第一个莫派? | 第三个月到期 | 三号莫派? | 第六个月到期 | 六号莫派? | 上次未检查日期(计算) | 最后到期日期(计算) |
---|---|---|---|---|---|---|---|---|---|---|
1042 | 汤姆,C | 2019 年 12 月 5 日 | 2020 年 1 月 5 日 | 真的 | 2020 年 3 月 5 日 | 真的 | 2020 年 6 月 5 日 | 错误的 | 2020 年 6 月 5 日 | 第六个月到期 |
那么在第六次莫派下?列,将选中现在为 FALSE 或未选中的复选框
解决方案
试试这个:
function myFunction() {
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Master List');
var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Payment Due By Date');
var spreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();
//Use getDisplayValues so the complier won't automatically convert the date based on timezone.
var sheet1_val = sheet1.getRange(2, 1, 12, 11).getDisplayValues();
//get Ids and merge into 1 dimensional array
var sheet1_ids = [].concat(...sheet1.getRange(2, 1, 12, 1).getDisplayValues());
var sheet2_val = sheet2.getRange(4,1,sheet2.getLastRow()-3, 4).getDisplayValues();
for(var i = 0; i < sheet2_val.length; i++){
var customer_id = sheet2_val[i][0];
var pay_due_date = sheet2_val[i][2];
//check if customer id exists in the id list (sheet1_ids)
if (sheet1_ids.indexOf(customer_id) !== -1) {
//get the position/index of the id
var index = sheet1_ids.indexOf(customer_id);
//I used 3 and 8 since we only need the column D-H
for(var j = 3; j < 8; j++){
//Iterate and check each column if match to the pay_due_date
if(pay_due_date == sheet1_val[index][j]){
//assign new value
sheet1_val[index][j+1] = "TRUE";
}
}
}
}
var lastRow = sheet1.getLastRow();
//merge subarrays with same index
var sheet1Transpose = transpose(sheet1_val);
var request = {
'valueInputOption': 'USER_ENTERED',
'data': [
{
'range': 'Master List!E2:E'+lastRow,
'majorDimension': 'COLUMNS',
'values': [sheet1Transpose[4]]
},
{
'range': 'Master List!G2:G'+lastRow,
'majorDimension': 'COLUMNS',
'values': [sheet1Transpose[6]]
},
{
'range': 'Master List!I2:I'+lastRow,
'majorDimension': 'COLUMNS',
'values': [sheet1Transpose[8]]
}
]
};
var response = Sheets.Spreadsheets.Values.batchUpdate(request, spreadsheetId);
}
function transpose(matrix) {
return matrix[0].map((col, i) => matrix.map(row => row[i]));
}
注意: 确保在服务中添加 Google 表格。
例子:
付款截止日期:
前:
参考:
推荐阅读
- postgresql - 如何将数据从 postgresql 同步到 GreenPlum?gpfdist? 还是 gp 流服务器?
- angular - 如何为 angular-cli 设置全局配置?
- sql-server - T-SQL CASE 语句返回不同的过滤器
- python-3.x - 在 Python 3 中,我们可以使用 str.format() 和列表获得以下输出?
- php - MacOS 10.15.1 Catalina 上的 Homebrew PHP 7.4 升级失败
- types - 你能在 Coq 中枚举所有归纳类型的值吗?
- java - 尝试使用 Firebase MLKit 条码扫描器,模拟器屏幕出现“等待条码检测模块下载,请稍候”
- java - JAVA EMAIL API 上的错误(无法解析 javax.mail.Authenticator 类型。它是从所需的 .class 文件中间接引用的)
- c - 如何使用leaks 命令行工具查找内存泄漏?
- python - 在 Sublime 编辑器中出现错误:Python 代码