Google apps script 在两个单元格中循环查找匹配项,然后在出现';这是一场比赛
我正在尝试编写一个google应用程序sctipt,它循环到日期范围以查找匹配项,并且对于找到的每个匹配项,它都会将指定范围的“费用”复制到指定范围。当我运行脚本时,它会执行,但什么也没发生。它超过了执行时间限制,所以我认为它陷入了一个循环 更新:我已经创建了一个测试工作表,如果有人想查看相关数据的示例: 这是我的密码:Google apps script 在两个单元格中循环查找匹配项,然后在出现';这是一场比赛,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在尝试编写一个google应用程序sctipt,它循环到日期范围以查找匹配项,并且对于找到的每个匹配项,它都会将指定范围的“费用”复制到指定范围。当我运行脚本时,它会执行,但什么也没发生。它超过了执行时间限制,所以我认为它陷入了一个循环 更新:我已经创建了一个测试工作表,如果有人想查看相关数据的示例: 这是我的密码: function menuItem1() { var sheet = SpreadsheetApp.getActiveSheet(); //Updating Expen
function menuItem1() {
var sheet = SpreadsheetApp.getActiveSheet();
//Updating Expenses 2
for(row = 10; row <= 61; row++){
var date1 = sheet.getRange(row, 3, 1);
var date1value = date1.getValue();
for(row2 = 22; row2 < 59; row++){
var date2 = sheet.getRange(row2, 18, 1);
var date2value = date2.getValue();
if(date1value == date2value){
sheet.getRange(row2, 19, 2, 8).copyTo(sheet.getRange(row1, 5, 8), {contentsOnly:true});
}
}
函数menuItem1(){
var sheet=SpreadsheetApp.getActiveSheet();
//更新费用2
对于(row=10;row),您应该阅读有关的文档,以尝试加快代码的速度
下面是你的代码的严格翻译,当你做完全相同的事情时,它将在不到一秒钟内执行。一旦你摆脱超时问题,我希望你能让它做你想做的事情
当然,我没有测试脚本的最终目标,因为我不知道您的数据
有几个变量是日期,在这种情况下,您应该特别注意它,看看日期是否最终有一个在工作表中看不到的相关时间值,并处理它
代码:
function menuItem1() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();// get all values in your sheet up to the last row and last column (where data exist)
// define limits in array (values = row values-1)
var r1start = 9;
var r1max = 60;
var r2start = 21;
var r2max = 58;
// choose columns
var col1 = 2;
var col2 = 17;
for(var r1=r1start ; r1<r1max ; r1++){
for(var r2=r2start ; r2<r2max ; r2++){
if(data[r1][col1] == data[r2][col2]){
sheet.getRange(r2+1, 19, 2, 8).copyTo(sheet.getRange(r1+1, 5, 8), {contentsOnly:true});
Logger.log('match found');
}
}
}
}
函数menuItem1(){
var sheet=SpreadsheetApp.getActiveSheet();
var data=sheet.getDataRange().getValues();//获取工作表中直到最后一行和最后一列(数据存在的位置)的所有值
//在数组中定义限制(值=行值-1)
var r1=9;
var r1最大值=60;
var r2start=21;
var r2max=58;
//选择列
var col1=2;
var-col2=17;
对于(var r1=r1start;r1非常感谢您让我了解最佳实践。我肯定会仔细阅读。但是对于您提供的代码,它肯定解决了超出执行时间限制的问题,但它没有成功地复制数据,我不确定为什么……如果您想查看数据,我已经创建了一个测试工作表。添加了上面的链接。正如您将看到的,有相应的日期,但匹配的日期不会导致工作表右侧的数据被复制到相应的左侧日期。感谢工作表副本…现在容易多了;-)顺便说一句,当您提供共享工作表的链接时,您应该在“仅查看”中共享它(并强迫人们做一份副本来测试)以避免一些用户在你的工作表中塞满各种垃圾;-)(我从经验中学到了!!,即使在这里,你也不能信任人;-)我允许自己更改共享属性…希望你不会介意;-)非常感谢Serge(并注意到未来的共享,哈哈).这很有效!你真厉害!
function menuItem1() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();// get all values in your sheet up to the last row and last column (where data exist)
// define limits in array (values = row values-1)
var r1start = 9;
var r1max = 60;
var r2start = 21;
var r2max = 58;
// choose columns
var col1 = 2;
var col2 = 17;
for(var r1=r1start ; r1<r1max ; r1++){
for(var r2=r2start ; r2<r2max ; r2++){
if(data[r1][col1]=='' || data[r2][col2]==''){continue}; // skip all empty rows to avoid false equalities in empty cells and speed up the process
Logger.log(data[r1][col1]+' = ? '+data[r2][col2]);// this is only to view data in the logger
if(data[r1][col1].getTime() == data[r2][col2].getTime() ){ // compare on date native values
sheet.getRange(r2+1, 19, 2, 8).copyTo(sheet.getRange(r1+1, 5, 8), {contentsOnly:true});
Logger.log('match found');
}
}
}
}