Google apps script 使脚本更快/更高效
我正在尝试使用脚本检查sheet1中的名字和姓氏(2个单元格),在sheet1中使用每个人的名字和姓氏,然后在sheet2中检查每个人在4-5行中的值是否大于0 问题是某些名称在不同的列中,我需要检查一列,并根据一个大的(180个单元格)名称列表检查该列中的名称。这是它超时的部分 我有完整的代码运行和工作,但它使用了太多的部分,并最终超时。getvalue函数被大量使用,我不确定是否有更好的方法使用它。我正在寻找如何使它更有效率和/或运行得更好 我可能只需要在代码中输入名称,以加快速度,但我希望有一种更为用户友好的方法,以便名称可以在sheet1中更改,并在脚本中自动设置格式 谢谢大家!Google apps script 使脚本更快/更高效,google-apps-script,Google Apps Script,我正在尝试使用脚本检查sheet1中的名字和姓氏(2个单元格),在sheet1中使用每个人的名字和姓氏,然后在sheet2中检查每个人在4-5行中的值是否大于0 问题是某些名称在不同的列中,我需要检查一列,并根据一个大的(180个单元格)名称列表检查该列中的名称。这是它超时的部分 我有完整的代码运行和工作,但它使用了太多的部分,并最终超时。getvalue函数被大量使用,我不确定是否有更好的方法使用它。我正在寻找如何使它更有效率和/或运行得更好 我可能只需要在代码中输入名称,以加快速度,但我希望
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(“,”),你有我可以尝试的例子吗?alla_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]))
}