Google apps script 谷歌应用程序脚本:功能更新名称从一个工作表到另一个超时。请改进我的循环

Google apps script 谷歌应用程序脚本:功能更新名称从一个工作表到另一个超时。请改进我的循环,google-apps-script,Google Apps Script,我有一个通过谷歌文档(GoogleDocs)的应用程序,我用它来记录我的课后辅导中心的学生出勤情况。我的出勤率比平时高,而且我的代码在超时之前运行效率不够。请帮助我编辑我的代码,以便它更有效地运行 我必须指出,我是一个绝对的初学者,所以如果这是不适当的张贴,请给我建设性的反馈,如何获得帮助,这个问题。我为你即将看到的(我想)可怕的代码提前道歉——这是我能做的最好的了,我非常努力地创造了这个 多谢各位 代码: 函数更新趋势(){ var itemSpreadsheetKey=''; var ope

我有一个通过谷歌文档(GoogleDocs)的应用程序,我用它来记录我的课后辅导中心的学生出勤情况。我的出勤率比平时高,而且我的代码在超时之前运行效率不够。请帮助我编辑我的代码,以便它更有效地运行

我必须指出,我是一个绝对的初学者,所以如果这是不适当的张贴,请给我建设性的反馈,如何获得帮助,这个问题。我为你即将看到的(我想)可怕的代码提前道歉——这是我能做的最好的了,我非常努力地创造了这个

多谢各位

代码:

函数更新趋势(){
var itemSpreadsheetKey='';
var openedSS=SpreadsheetApp.openById(itemSpreadsheetKey);
var sheetStudentNames=openedSS.getSheetByName(“StudentNames”);
var sheetDailyData=openedSS.getSheetByName(“DailyData”);
var app=UiApp.getActiveApplication();
var ss=SpreadsheetApp.openById(itemseadsheetkey);
var dailyDataSheet=ss.getSheetByName(“DailyData”);
var studentNameSheet=ss.getSheetByName(“StudentNames”);
var dailyData=dailyDataSheet.getDataRange();
var studentNames=studentNameSheet.getDataRange();
var dailyllastrow=dailyData.getLastRow();
var studentNamesLastRow=studentNames.getLastRow();
var studentNamesLastColumn=studentNames.getLastColumn();
var dailyDataNamesArray=sheetDailyData.getRange(2,1,dailyllastrow.getValues();

对于(var i=1;i将
var dailyDataNamesArray
行后的代码替换为以下内容。这有点像猜测,因此我希望它能起作用:

var todayCell1 = studentNames.getCell(1, studentNamesLastColumn).offset(0, 1);
for (var i=1; i<=dailyDataNamesArray.length; i++) {
  if (i != ""){
    var dailyTime = dailyData.getCell(i, 5).getValue();
    var dailyVar2 = dailyData.getCell(i, 1).getValue();
    for (var j=2; j<=studentNamesLastRow; j++) {
      var today = dailyData.getCell(1, 8).getValue();
      if ( dailyVar2 == studentNames.getCell(j, 1).getValue()) {
        todayCell1.setValue(today);
        studentNames.getCell(j, studentNamesLastColumn).offset(0, 1).setValue(dailyTime);
      }
    }
  }
}
var todayCell1=studentNames.getCell(1,studentNamesLastColumn).offset(0,1);

对于(var i=1;i如果希望脚本运行得更快,则必须使用数组操作,而不是所有这些range.setValue()

更改全局数组(实际上是一对数组)中的所有值,完成后只需将这些数组写入各自的表中

差别将是巨大的!相信我;)

所有这一切在报告中都得到了很好的解释

这是你的代码的“翻译”,我不确定我在转置中没有犯任何错误,但我无法在不知道你的工作表中有什么的情况下进行检查

请记住,数组是0索引的,而范围从1开始

function updateAttendance(){
  var itemSpreadsheetKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';
  var openedSS = SpreadsheetApp.openById(itemSpreadsheetKey);
  var sheetStudentNames = openedSS.getSheetByName("StudentNames");
  var sheetDailyData = openedSS.getSheetByName("DailyData");
  var app = UiApp.getActiveApplication();
  var ss = SpreadsheetApp.openById(itemSpreadsheetKey);
  var dailyDataSheet = ss.getSheetByName("DailyData");
  var studentNameSheet = ss.getSheetByName("StudentNames");
  var dailyData = dailyDataSheet.getDataRange();
  var studentNames = studentNameSheet.getDataRange().getValues();
  var dailyLastRow = dailyData.getLastRow();
  var studentNamesLastRow = studentNames.getLastRow();
  var studentNamesLastColumn = studentNames.getLastColumn();
  var dailyDataNamesArray = sheetDailyData.getDataRange().getValues();

  for (var i = 1 ; i < dailyDataNamesArray.length; i++) {
    if (i != ""){
      var dailyTime = dailyDataNamesArray[i][4];
      for (var j=1; j<studentNamesLastRow; j++) {
        var today = dailyDataNamesArray[0][7];
        if (dailyDataNamesArray[i][0] == studentNames[i][0])     {
          studentNames[0][studentNamesLastColumn+1] = today;
          studentNames[j][studentNamesLastColumn+1] = dailyTime;
        } 
      }
    }
  }  
  studentNameSheet.getRange(1,1,studentNames.length,studentNames[0].length).setValues(studentNames):  
  dailyDataSheet.getRange(1,1,dailyDataNamesArray.length,dailyDataNamesArray[0].length).setValues(dailyDataNamesArray):  
  return app;
}
函数更新趋势(){
var itemSpreadsheetKey='xxxxxxxxxxxxxxxxxxxxxxxxxxxx';
var openedSS=SpreadsheetApp.openById(itemSpreadsheetKey);
var sheetStudentNames=openedSS.getSheetByName(“StudentNames”);
var sheetDailyData=openedSS.getSheetByName(“DailyData”);
var app=UiApp.getActiveApplication();
var ss=SpreadsheetApp.openById(itemseadsheetkey);
var dailyDataSheet=ss.getSheetByName(“DailyData”);
var studentNameSheet=ss.getSheetByName(“StudentNames”);
var dailyData=dailyDataSheet.getDataRange();
var studentNames=studentNameSheet.getDataRange().getValues();
var dailyllastrow=dailyData.getLastRow();
var studentNamesLastRow=studentNames.getLastRow();
var studentNamesLastColumn=studentNames.getLastColumn();
var dailyDataNamesArray=sheetDailyData.getDataRange().getValues();
对于(变量i=1;i对于(var j=1;jChange或hide您的电子表格键以防止可能的故意破坏-有一些严重反社会的人在那里。这不会有什么区别。需要使用诸如get/setvalues之类的数组版本感谢您的输入-这可以工作,尽管我在这行代码中遇到了一个“未定义”错误:if(dailyDataNamesArray[i][0]==studentNames[i][0])我相信这是在说“studentNames部分未定义,但我不确定。正如我所说,这确实是一个初学者。如果(dailyDataNamesArray[i][0]==studentNames[j][0],我似乎犯了一个错误相反?正如我所说,在不知道日期的情况下,翻译并不容易。在某些地方使用Logger.log检查脚本中的数据。
function updateAttendance(){
  var itemSpreadsheetKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';
  var openedSS = SpreadsheetApp.openById(itemSpreadsheetKey);
  var sheetStudentNames = openedSS.getSheetByName("StudentNames");
  var sheetDailyData = openedSS.getSheetByName("DailyData");
  var app = UiApp.getActiveApplication();
  var ss = SpreadsheetApp.openById(itemSpreadsheetKey);
  var dailyDataSheet = ss.getSheetByName("DailyData");
  var studentNameSheet = ss.getSheetByName("StudentNames");
  var dailyData = dailyDataSheet.getDataRange();
  var studentNames = studentNameSheet.getDataRange().getValues();
  var dailyLastRow = dailyData.getLastRow();
  var studentNamesLastRow = studentNames.getLastRow();
  var studentNamesLastColumn = studentNames.getLastColumn();
  var dailyDataNamesArray = sheetDailyData.getDataRange().getValues();

  for (var i = 1 ; i < dailyDataNamesArray.length; i++) {
    if (i != ""){
      var dailyTime = dailyDataNamesArray[i][4];
      for (var j=1; j<studentNamesLastRow; j++) {
        var today = dailyDataNamesArray[0][7];
        if (dailyDataNamesArray[i][0] == studentNames[i][0])     {
          studentNames[0][studentNamesLastColumn+1] = today;
          studentNames[j][studentNamesLastColumn+1] = dailyTime;
        } 
      }
    }
  }  
  studentNameSheet.getRange(1,1,studentNames.length,studentNames[0].length).setValues(studentNames):  
  dailyDataSheet.getRange(1,1,dailyDataNamesArray.length,dailyDataNamesArray[0].length).setValues(dailyDataNamesArray):  
  return app;
}