【问题标题】:Google Script: print school schedule data for each teacherGoogle Script:打印每位教师的学校时间表数据
【发布时间】:2017-09-29 22:50:26
【问题描述】:

这是我在这里的第一个问题。据我所知,我已经搜索了该网站,但没有找到我的问题的任何其他示例。

这是 Google 表格文件 https://docs.google.com/spreadsheets/d/1HxyhoxuPK8H8_vhLg0ZZ-THyOn1cn9nPYRyls8y47iM/edit?usp=sharing

我在同一个 Google 表格文档中有 2 张表格。 第一个,“模式”包含一个教师的基础学校时间表,在不同的街区有不同的班级。这需要复制,以便所有教师都具有这种精确设置 - 以便所有唯一用户拥有相同的 50 行日程安排数据 - 仅限于分配给他们的班级。

第二张表包含有关用户的信息。每行包含一个 UNI 登录用户名及其指定的类 1a-1、4a-1 和 8a-1,例如用户 uni12345。 1a-1 需要替换“uni12345”的日程数据中的1。

我希望将所有这些数据(很多行)合并到一张表中,fx。称为“组合”-但您可以选择名称:-)

我制作了一个组合示例表,显示了我希望列表中 user1+2 的输出。

如果问题已经在其他地方得到部分回答,我也很乐意看看!

编辑: 自从我最初的问题以来,我已经让它工作了——只是现在我达到了 6 分钟的脚本执行时间限制。任何解决方法,例如。优化?

    function merge() {

  var CurrentDate       = new Date() ;  
  var CurrentDateString1 = Utilities.formatDate(CurrentDate, "GMT", "MM-dd-yyyy HH:mm:ss") ;

  var ss=SpreadsheetApp.getActive();
 // var mergeSht=ss.getSheetByName(CurrentDateString1);                     
  var users=ss.getSheetByName('users');
  var schema=ss.getSheetByName('schema');

  var mergeSht = ss.insertSheet();
  mergeSht.setName(CurrentDateString1);

  var usersValues = users.getDataRange().getValues();
  var schemaValues = schema.getDataRange().getValues();

  var counter = 1;


  for(var n=1; n < usersValues.length ; n++){

    var usersValue = usersValues[n];

    var uniName = usersValue[5];
    var levelInd = usersValue[2];
    var levelMellem = usersValue[3];
    var levelUdsk = usersValue[4];

// Logger.log(usersValues[n][5])

    for(var i=1; i < schemaValues.length ; i++){ 

      var schemaValue = schemaValues[i];

      if (schemaValue != null && schemaValue.length > 0) {

      var level = schemaValue[3];
      var subject = schemaValue[4];
      var room = schemaValue[5];
      var day = schemaValue[6];
      var position = schemaValue[7];

        var levelAfd = getlevel(level,levelInd, levelMellem, levelUdsk);
        Logger.log(levelAfd);

        // print

      var row=[];
        row.push(counter++,'','unilogin:'+ uniName, levelAfd, subject, room, day, position);
      mergeSht.appendRow(row);


      }
    }
  }
   }

    function getlevel(level, levelInd, levelMellem, levelUdsk){
        switch (level)
    {
        case 1:
            return levelInd;
        case 4:
        return levelMellem;
        case 7:
           return levelUdsk;
    }
}

【问题讨论】:

  • 我已经为这个问题添加了我的新解决方案;只是现在我在 Google Scripts 上达到了 6 分钟的最大执行时间。
  • 执行记录是什么样的?
  • 像这样:pastebin.com/jrgSFQVp
  • 通过将 getLevel 的开关合并到主循环中,您可能会获得小的性能改进。但是,其余的代码对我来说看起来不错。您可能必须想办法将函数分解为连续运行的部分。也许 usersValues 中的某些内容可以让您在较小的部分中执行它们。

标签: google-apps-script google-sheets google-spreadsheet-api


【解决方案1】:

您还可以尝试以下方法: 此代码创建了一个新数组,避免了必须逐行推送。相反,在最后一次加载整个 mergeSht。

function merge() 
{
  var CurrentDate       = new Date() ;  
  var CurrentDateString1 = Utilities.formatDate(CurrentDate, "GMT", "MM-dd-yyyy HH:mm:ss") ;
  var ss=SpreadsheetApp.getActive();
 // var mergeSht=ss.getSheetByName(CurrentDateString1);                     
  var users=ss.getSheetByName('users');
  var schema=ss.getSheetByName('schema');
  var mergeSht = ss.insertSheet();
  mergeSht.setName(CurrentDateString1);
  var usersValues = users.getDataRange().getValues();
  var schemaValues = schema.getDataRange().getValues();
  var counter = 1;
  var mergeA=[];//Small change
  mergeA.push(['H1','H2','H3','H4','H5','H6','H7','H8']); //First row is headers
  for(var n=1; n < usersValues.length ; n++)
  {
    var usersValue = usersValues[n];
    var uniName = usersValue[5];
    var levelInd = usersValue[2];
    var levelMellem = usersValue[3];
    var levelUdsk = usersValue[4];
// Logger.log(usersValues[n][5])
    for(var i=1; i < schemaValues.length ; i++)
    { 
      var schemaValue = schemaValues[i];
      if (schemaValue != null && schemaValue.length > 0) 
      {
      var level = schemaValue[3];
      var subject = schemaValue[4];
      var room = schemaValue[5];
      var day = schemaValue[6];
      var position = schemaValue[7];
      var levelAfd='';

        switch(level)
        {
          case 1:
            levelAfd=levelInd;
            break;
          case 4:
            levelAfd=levelMellem;
            break;
          case 7:
            levelAfd=levelUdsk;
            break;
          default:
            levelAfd='';
            break;
        }
        if(levelAfd)
        {
          mergeA.push([counter++,'','unilogin:'+ uniName, levelAfd, subject, room, day, position]);
        }
      }
    }
  }
  mergeSht.getRange(1,1,mergeA.length,mergeA[0].length).setValues(mergeA);
}

【讨论】:

  • 听起来很有趣!但是我收到错误“Google Sheets Script Error - Cannot convert Array to Object[][]”
  • 错误发生在第 58 行,“mergeSht.getRange(1,1,mergeA.length,mergeA[0].length).setValues(mergeA);”
  • 我在 mergeA 数组中做了一个小改动。再试一次。
  • 完美运行!在 10 秒内创建了 15000 行!真棒
猜你喜欢
  • 2013-08-25
  • 2011-12-15
  • 2023-03-31
  • 2019-07-04
  • 1970-01-01
  • 2023-01-28
  • 2019-03-18
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多