循环 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=]方法。
晚安,
我有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=]方法。