循环 2 google 张

loop through 2 google sheets

晚安,

我有2张。对于 sheet1 上的每个 ID,我需要验证该 ID 是否也在 sheet2 上以及处理日期是否为空。

如果两个条件都为真 > 今天的日期应该在处理日期中设置。

我已经成功地从工作表 1 中获取了 1 个值 (A2)。 我需要的是一种遍历 sheet1 中所有值的方法。理想情况下,sheet1 中的行也会被删除(不确定是否可能)

到目前为止,这是我的代码

function myMatch(){
var file  = SpreadsheetApp.getActiveSpreadsheet();
var ss    = file.getSheetByName("Sheet1");
var ws    = file.getSheetByName("Sheet2");

var wsData = ws.getDataRange().getValues();
var mySearch = ss.getRange("A2").getValue();

  for(var i = 0; i < wsData.length; i++){
    
    if(wsData[i][1] == mySearch && wsData[i][2] == "")
    {      
      ws.getRange(i+1,3).setNumberFormat('dd"-"mmm"-"yyyy').setValue(new Date());
    }
  }
}

非常感谢您的帮助,因为我已经尝试并寻找解决方案 2 天了。谢谢

为此你需要一个循环。使用

var mySearchs = ss.getRange('A2:A').getValues();

并遍历该数组的所有值。

function myMatch(){
  var file  = SpreadsheetApp.getActiveSpreadsheet();
  var ss    = file.getSheetByName("Sheet1");
  var ws    = file.getSheetByName("Sheet2");

  var wsData = ws.getDataRange().getValues();
  var mySearchs = ss.getRange('A2:A').getValues();

  mySearchs.forEach((v) => {
    for(var i = 0; i < wsData.length; i++){
      
      if(wsData[i][1] == v && wsData[i][2] == "")
      {      
        ws.getRange(i+1,3).setNumberFormat('dd"-"mmm"-"yyyy').setValue(new Date()); 
      }
    }
  })  
}

我知道这没有多大意义。 Muhammet 的代码可以正常工作并且看起来很好。但是,出于娱乐和教育目的,这是另一个“功能性”解决方案:

function myFunction() {

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const s1 = ss.getSheetByName('Sheet1');
  const s2 = ss.getSheetByName('Sheet2');

  // get data from Sheet1 and Sheet2
  const s1_data = s1.getDataRange().getValues().slice(1,);
  const s2_data = s2.getDataRange().getValues().slice(1,);

  // get IDs from data of Sheet1
  const IDs = s1_data.map(x => x[0]); 
  const IDs_to_delete = []; // here will be IDs to delete

  // function checks and fill a row and adds ID to array to delete
  const write_date = (id,row) => {
    if (row[1] == id && row[2] == '') { 
      IDs_to_delete.push(id); 
      row[2] = new Date();
    }
  }

  // change rows within data of Sheet 2
  IDs.forEach(id => s2_data.forEach(row => row = write_date(id,row)));

  // clear and fill Sheet 2
  s2.getDataRange().offset(1,0).clearContent();
  s2.getRange(2,1,s2_data.length,s2_data[0].length).setValues(s2_data);

  // remove rows from data of Sheet 1
  const s1_data_new = s1_data.filter(row => !IDs_to_delete.includes(row[0]));

  // clear and fill Sheet 1 with new data
  s1.getDataRange().offset(1,0).clearContent();
  s1.getRange(2,1,s1_data_new.length,s1_data_new[0].length).setValues(s1_data_new);

}

与 Muhamed 代码相比的唯一改进是此实现从 Sheet1 中删除了已处理的行。而且,我相信,对于大型列表,它会更快地工作,因为它不会在每个找到的单元格上使用 getRange()setValue(),而是立即用 [= 填充 sheet 的所有单元格13=]方法。