微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

循环遍历 2 个谷歌表

如何解决循环遍历 2 个谷歌表

再见,

我有 2 张纸。对于 sheet1 上的每个 ID,我需要验证该 ID 是否也在 sheet2 上,以及 Date Processed 是否为空白。

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

enter image description here

我已经设法为 sheet1 中的 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 天了。谢谢

解决方法

我知道这没有多大意义。 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,s1_data_new.length,s1_data_new[0].length).setValues(s1_data_new);

}

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

,

你需要一个循环。使用

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()); 
      }
    }
  })  
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。