Javascript 根据其他工作表的值/验证选中ID复选框

Javascript 根据其他工作表的值/验证选中ID复选框,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,以下是包含应用程序脚本的示例表: 我有一个主列表,跟踪是否发送了交易信函。3封信应该在交易日期后发送-初始交易日期后的第一个月、第三个月和第六个月,因此每个ID有3个复选框。如果发送了一封信,现在我会根据信的月份手动勾选一个复选框。我创建了第二个工作表,它将显示每个未选中的ID的所有最早日期,即单元格B2上的日期之前的日期。我的目标是,当我运行脚本时,它将勾选客户ID和日期匹配的所有对应复选框 以下是我当前的应用程序脚本代码: function myFunction() { var sh1

以下是包含应用程序脚本的示例表:

我有一个主列表,跟踪是否发送了交易信函。3封信应该在交易日期后发送-初始交易日期后的第一个月、第三个月和第六个月,因此每个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";
  }
  }
}
函数myFunction(){
var sh1=Sheets.Spreadsheets.Values.get('1AOzYMVqOqww4bUfSigDWz6gL6tmESfQxuKw4auNS4kU','Payment by Date!A4:D');
var sh2=Sheets.Spreadsheets.Values.get('1AOzYMVqOqww4bUfSigDWz6gL6tmESfQxuKw4auNS4kU','Master List!A2:K');
对于(变量i=0;i
当我检查记录器时,循环是我认为得到了值(如果我错了,请纠正我)。我不知道我的循环是否运行不正确,或者我如何检查复选框是否错误

编辑:我的工作表中的一个具体示例,说明我正在尝试做什么:

如果在付款到期日,则该行存在

客户ID 客户名称 付款到期日 到期付款单 1042 汤姆,C 6/5/2020 第六个月到期 试试这个:

  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]));
}
函数myFunction(){
var sheet1=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“主列表”);
var sheet2=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('到期付款日期');
var spreadsheetId=SpreadsheetApp.getActiveSpreadsheet().getId();
//使用getDisplayValues,使编译器不会基于时区自动转换日期。
var sheet1_val=sheet1.getRange(2,1,12,11).getDisplayValues();
//获取ID并合并到一维数组中
var sheet1_id=[].concat(…sheet1.getRange(2,1,12,1).getDisplayValues());
var sheet2_val=sheet2.getRange(4,1,sheet2.getLastRow()-3,4.getDisplayValues();
对于(变量i=0;imatrix.map(row=>row[i]);
}
注意:确保在服务中添加谷歌工作表

例子: 付款到期日:

之前:

之后:

参考:

非常感谢您的回复,选中匹配id/日期的复选框是可行的,但它正在删除主列表中的所有公式。你知道为什么会这样吗?这一点很重要,因为我的一些列都是公式,就像向下拖动vlookups一样,所以我的公式不仅出现在第2行中,而且出现在最后一行中。只是补充说明。未删除到期付款日期表中的公式。是否使用公式填充复选框?是的。它按预期工作,只是删除了主列表中的所有公式。这是因为我们将整行替换为值,而不仅仅是带有复选框的单元格吗?例如,第一个月到期日、第三个月到期日、第六个月到期日和最后一个未选中的日期都有计算。当我运行脚本时,它删除了计算。到期付款日期表上的列表是从主列表中最后一个未检查的日期填充的,因此我希望一旦在主列表中检查了它们,它们就会从到期付款日期表中删除。