Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 使脚本更快/更高效_Google Apps Script - Fatal编程技术网

Google apps script 使脚本更快/更高效

Google apps script 使脚本更快/更高效,google-apps-script,Google Apps Script,我正在尝试使用脚本检查sheet1中的名字和姓氏(2个单元格),在sheet1中使用每个人的名字和姓氏,然后在sheet2中检查每个人在4-5行中的值是否大于0 问题是某些名称在不同的列中,我需要检查一列,并根据一个大的(180个单元格)名称列表检查该列中的名称。这是它超时的部分 我有完整的代码运行和工作,但它使用了太多的部分,并最终超时。getvalue函数被大量使用,我不确定是否有更好的方法使用它。我正在寻找如何使它更有效率和/或运行得更好 我可能只需要在代码中输入名称,以加快速度,但我希望

我正在尝试使用脚本检查sheet1中的名字和姓氏(2个单元格),在sheet1中使用每个人的名字和姓氏,然后在sheet2中检查每个人在4-5行中的值是否大于0

问题是某些名称在不同的列中,我需要检查一列,并根据一个大的(180个单元格)名称列表检查该列中的名称。这是它超时的部分

我有完整的代码运行和工作,但它使用了太多的部分,并最终超时。getvalue函数被大量使用,我不确定是否有更好的方法使用它。我正在寻找如何使它更有效率和/或运行得更好

我可能只需要在代码中输入名称,以加快速度,但我希望有一种更为用户友好的方法,以便名称可以在sheet1中更改,并在脚本中自动设置格式

谢谢大家!

function getvalue(CellName) {
  return SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet2').getRange(CellName).getValues();
}

function getAdvisee(CellName) {
 return SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1').getRange(CellName).getValues(); 
}

function teacher1() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
  var LastRow = ss.getLastRow();
  var columns = 3;
  var columnassignments = 3;
  var columnEnrichment = 3;
  var columnAmount = 3;
  var advisoryStudent = getvalue('a' + columnEnrichment);
  var studentEnrichment = getvalue('g'+ columnEnrichment);
  var hours = Utilities.formatDate(studentEnrichment, 'EST', 'mm');
  var minutes = Utilities.formatDate(studentEnrichment, 'EST', 'ss');
  var teacherEmail = getAdvisee('b2');
  var student1 = getAdvisee('b3');
  var student1F = getAdvisee('b3');
  var student2 = getAdvisee('b4');
  var student2F = getAdvisee('b4');
  var student3 = getAdvisee('b5');
  var student3F = getAdvisee('b5');
  var student4 = getAdvisee('b6');
  var student4F = getAdvisee('b6');
  var student5 = getAdvisee('b7');
  var student5F = getAdvisee('b7');
  var student6 = getAdvisee('b8');
  var student6F = getAdvisee('b8');
  var student7 = getAdvisee('b9');
  var student7F = getAdvisee('c9');
  var student8 = getAdvisee('b10');
  var student8F = getAdvisee('c10');
  var student9 = getAdvisee('b11');
  var student9F = getAdvisee('c11');
  var student10 = getAdvisee('b12');
  var student10F = getAdvisee('c12');
  var student11 = getAdvisee('b13');
  var student11F = getAdvisee('c13');


  for (columns; columns <= LastRow && columns <= 160; columns++) {
    var advisoryStudent = getvalue('a' + columns);
    var advisoryStudentSp = getvalue('b' + columns);
    var reminderCount = getvalue('e' + columns);
    var reminderLink = getvalue('m'+columns);
    if (advisoryStudentSp == student1F || advisoryStudent == student2 && advisoryStudentSp == student2F || advisoryStudentSp == student3F || advisoryStudentSp == student4F || advisoryStudentSp == student5F || advisoryStudentSp == student6F || advisoryStudentSp == student7F && advisoryStudent == student7 || advisoryStudentSp == student8F || advisoryStudent == student9 && advisoryStudentSp == student9F|| advisoryStudent == student10 && advisoryStudentSp == student10F || advisoryStudent == student11 && advisoryStudentSp == student11F) {
      if ( getvalue('e' + columns) > 0 ) {
        reminders = reminders + getvalue('b' + columns) + ' ' + getvalue('a' + columns) + ': ' + reminderCount + '<br>Reminder Link: ' + reminderLink + '<br>';
      }
    }
  }

  for (columnassignments; columnassignments <= LastRow && columnassignments <= 160; columnassignments++) {
    var advisoryStudent = getvalue('a' + columnassignments);
    var advisoryStudentSp = getvalue('b'+columnassignments);
    var assignmentCount = getvalue ('f' + columnassignments);
    var assignmentLink = getvalue('n' + columnassignments);
    if (advisoryStudentSp == student1F || advisoryStudent == student2 && advisoryStudentSp == student2F || advisoryStudentSp == student3F || advisoryStudentSp == student4F || advisoryStudentSp == student5F || advisoryStudentSp == student6F || advisoryStudentSp == student7F && advisoryStudent == student7 || advisoryStudentSp == student8F || advisoryStudent == student9 && advisoryStudentSp == student9F|| advisoryStudent == student10 && advisoryStudentSp == student10F || advisoryStudent == student11 && advisoryStudentSp == student11F) {
      if (getvalue('f' + columnassignments) > 0) {
        assignments = assignments + getvalue('b' + columnassignments) + ' ' + getvalue('a' + columnassignments) + ': ' + assignmentCount + '<br>Assignment Link: ' + assignmentLink + '<br>';
      }
    }
  }

    for (columnAmount; columnAmount <= LastRow && columnAmount <= 160; columnAmount++) {
      var advisoryStudent = getvalue('a' + columnAmount);
      var advisoryStudentSp = getvalue('b' + columnAmount);
      var amountowed = getvalue ('i' + columnAmount);
      if (advisoryStudentSp == student1F || advisoryStudent == student2 && advisoryStudentSp == student2F || advisoryStudentSp == student3F || advisoryStudentSp == student4F || advisoryStudentSp == student5F || advisoryStudentSp == student6F || advisoryStudentSp == student7F && advisoryStudent == student7 || advisoryStudentSp == student8F || advisoryStudent == student9|| advisoryStudent == student10 && advisoryStudentSp == student10F || advisoryStudent == student11 && advisoryStudentSp == student11F) {
        if (getvalue('i' + columnAmount) > 0) {
          amount = amount + getvalue('b' + columnAmount) + ' ' + getvalue('a' + columnAmount) + ': ' + '$' + amountowed + '<br>';
        }
      }
    }
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Status Calculator');
  var LastRow = ss.getLastRow();
  var columns = 3;
  var columnassignments = 3;
  var columnEnrichment = 3;
  for (columnEnrichment; columnEnrichment <= LastRow && columnEnrichment <= 160; columnEnrichment++) {
    var advisoryStudent = getvalue('a'+columnEnrichment);
    var advisoryStudentSp = getvalue('b' + columnEnrichment);
    if (advisoryStudentSp == student1F || advisoryStudent == student2 && advisoryStudentSp == student2F || advisoryStudentSp == student3F || advisoryStudentSp == student4F || advisoryStudentSp == student5F || advisoryStudentSp == student6F || advisoryStudentSp == student7F && advisoryStudent == student7 || advisoryStudentSp == student8F || advisoryStudent == student9 && advisoryStudentSp == student9F|| advisoryStudent == student10 && advisoryStudentSp == student10F || advisoryStudent == student11 && advisoryStudentSp == student11F) {
      if (Utilities.formatDate(getvalue('g' + columnEnrichment), 'EST', 'HH') > 0 || Utilities.formatDate(getvalue('g' + columnEnrichment), 'EST', 'mm') > 0){
        enrichment = enrichment + getvalue('b' + columnEnrichment) + ' ' + getvalue('a' + columnEnrichment) + ': ' + Utilities.formatDate(getvalue('g' + columnEnrichment), 'EST', 'HH') + ' hours ' + Utilities.formatDate(getvalue('g' + columnEnrichment), 'EST', 'mm') + ' minutes <br>'
      } 
    }
  }

}
函数getvalue(CellName){
返回SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet2').getRange(CellName).getValues();
}
函数GetAdvise(手机名){
返回SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1').getRange(CellName).getValues();
}
函数教师1(){
var ss=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
var LastRow=ss.getLastRow();
var列=3;
var=3;
var=3;
风险价值金额=3;
var advisoryStudent=getvalue('a'+列);
var studentEnrichment=getvalue('g'+columnEnrichment);
var hours=Utilities.formatDate(studenterRichment'EST','mm');
var minutes=Utilities.formatDate(studenterRichment'EST','ss');
var teacherEmail=GetAdvise('b2');
var student1=GetAdvise('b3');
var student1F=GetAdvise('b3');
var student2=GetAdvise('b4');
var student2F=GetAdvise('b4');
var student3=GetAdvise('b5');
var student3F=GetAdvise('b5');
var student4=GetAdvise('b6');
var student4F=GetAdvise('b6');
var student5=GetAdvise('b7');
var student5F=GetAdvise('b7');
var student6=GetAdvise('b8');
var student6F=GetAdvise('b8');
var student7=GetAdvise('b9');
var student7F=GetAdvise('c9');
var student8=GetAdvise('b10');
var student8F=GetAdvise('c10');
var student9=GetAdvise('b11');
var student9F=GetAdvise('c11');
var student10=GetAdvise('b12');
var student10F=GetAdvise('c12');
var student11=GetAdvise('b13');
var student11F=GetAdvise('c13');
对于(列;列=5)
Logger.log('较大的'+'行'+(i+1))
} 
}
}
}

与使用getValue()/GetAdvise()公式逐个检索单元格值不同,您需要使用Range.getValues()一次性读取整个工作表或相关范围,然后处理数组中的数据

这里的关键问题是,每次调用Range.getValues()都会消耗大量时间,无论是一次性读取100个单元格还是单个单元格的值。因此,当前每次读取一个单元格的方法非常慢(如您所见)


以这种方式进行重构太大,无法作为我回答的一部分,但一旦完成,此脚本将在几秒钟内运行。

您需要使用Range.getValues()一次性读取整个工作表或相关范围,而不是使用getValue()/getAdvise()公式逐个检索单元格值,然后处理数组中的数据

这里的关键问题是,每次调用Range.getValues()都会消耗大量时间,无论是一次性读取100个单元格还是单个单元格的值。因此,当前每次读取一个单元格的方法非常慢(如您所见)


以这种方式进行重构太大,无法作为我回答的一部分,但一旦完成,该脚本将在几秒钟内运行。

我建议按数据的自然网格范围将数据分组,然后按数组索引访问值

大致如下:


编辑:添加了一些重要的
.getValues()

我建议将数据按其自然网格范围分组,然后按数组索引访问值

大致如下:


编辑:添加了一些重要的
.getValues()

谢谢您的回复。上面我快速编辑了一些内容,只是测试了一个示例代码。由于缺乏经验,我无法让它像您的示例代码那样工作,但它非常接近。请您查看一下,并告诉我这是否是一种有效的方法?col中的值是唯一的吗?如果是,我会。可能是一个更好的地方问这个问题。有很多方法可以解决这个问题,而你的方法在降低配额命中率的同时也很有效——这是主要问题。对于你的问题,我想我已经回答了。我很抱歉。有些是独特的,但不是所有的都是,这是我遇到的问题。我目前正在编辑上面的脚本,以满足我的工作需要,它有效p完美地没有计时器(快速,但仍然是弗兰肯斯坦式的)。在计时器上,它可以工作,但有时它声称有太多的点击,主要是因为试图通过所有180行工作。出于某种原因,我无法获得a_col.join().split(“,”),你有我可以尝试的例子吗?all
a_col.join().split(“,”)
的作用是将像
[[1]、[2]、[3]]
这样的数组展平为
[1,2,3]
,这使得使用
indexOf()
非常有用。这是假设该列中的值是唯一的,因为它们不是for循环,可能是最好的选择。将数据范围更改为
sh2.getRange(1,sh_2.getLastRow(),1,3.getValues())
-这样您就不会添加额外的空行来循环。它将获得最后一行数据,该数据的范围值应为
sh2.getRange(1,1,sh_2.getLastRow(),3)。getValues()
对于“A1:C”,感谢您的回答。Ab
function getValues(CellName) {
 return SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2').getRange(CellName).getValues(); 
}

function setvalue(CellName, value) {
 return SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2').getRange(CellName).setValue(value); 
}

function test(i) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh2 = ss.getSheetByName('Sheet2');
  var data = sh2.getRange('A1:C200').getValues();
  var amount = sh2.getRange('c1:c200').getValues()
  var findthis = sh2.getRange('e1').getValues();

  var acol = sh2.getRange(1,sh2.getLastRow(),1,1).getValues();
  var bcol = sh2.getRange(1,sh2.getLastRow(), 2, 1).getValues();

  var test = acol.join().split(',');
  var test2 = bcol.join().split(',');

  for (i = 0; i<data.length; i++) { //search all rows
      if ('wet' == data[i][0]) { //finds wet in the data column and returns row
       Logger.log('testing' + ' row '  + (i+1)) 

       if (amount[i][0] >= 5) { //search if c >= 5
         Logger.log('Larger ' + ' row '  + (i+1)) 
       } 

      }

    }

}
function teacher1() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh_1 = ss.getSheetByName('sheet1');
  var sh_2 = ss.getSheetByName('sheet2');
  ...
   // Get all related values into array & retrieve each row record by index
   var student = sh_1.getRange("B3:C13").getValues(); // student[row][col] :ex: student11 => student[12][0]::student11F => student[12][1]

  ...
  // remove the for loop & get all values in a col with one call per col
  //(this could be optimized further)
  var a_col = sh_2.getRange(1, sh_2.getLastRow(), 1, 1).getValues(); // col a rows 1-lastrow()
  var b_col = sh_2.getRange(1, sh_2.getLastRow(), 2, 1).getValues(); // col b rows 1-lastrow()

  // Flatten the array to make searching that column easier
  var advisoryStudent = a_col.join().split(",")
  var advisoryStudentSp = b_col.join().split(",")
  // etc ...


  // To check if student11 is in advisoryStudentSp: (can loop through students here)
  // -1 means not found
  // any other number is the index position of `advisoryStudentSp[i]`
  // if 5 is returned then student11 matched the value in sheet2 colB row6
  Logger.log("student11 is in position: %s", advisoryStudentSp.indexOf(student[12][0]))

}