【问题标题】:Google apps script throwing error sometime in loop - help debug?谷歌应用程序脚本有时在循环中抛出错误 - 帮助调试?
【发布时间】:2020-01-02 16:43:58
【问题描述】:

我是 Google Apps 脚本的新手,如果这是非常基本的内容,我深表歉意。

我有一个工作簿,其中多名员工跟踪他们在不同项目上的工作时间。每个员工在工作簿中都有自己的工作表,以他们的姓氏命名。每个工作表都有人的姓名、他们的项目和他们的工作时间的列。工作表仅包含该周的小时数,因此完成的行数因人和周而异。

我想要一个脚本循环遍历每个人的工作表,复制他们的数据,并将其粘贴到一个主工作表中,以便随着时间的推移跟踪每个人。

我对此进行了尝试(请参见下面的代码)。它完全符合我的要求;但是,它永远不会通过所有工作表 - 在某些时候,它总是在“var source_range = source_sheet.getRange('A3:E'+(ct)); ”行上引发错误。我认为这是因为 ct 变量由于某种原因保持为零。但是,所有工作表至少在第 1-3 行的 E 列中都有文本。此外,如果我移动工作表(重新排序),引发错误的工作表会发生变化。它有助于按字母顺序排列工作表(在错误发生之前它通过了更多工作表),但是一旦到达以 R 之后的东西命名的第一张工作表(关于在我想要的一张工作表之后出现的事情),我仍然会收到错误它要跳过吗?-但它会毫无问题地跳过标题为“仪表板”的那个)。

由于我缺乏经验,我认为这是显而易见的事情 - 任何帮助将不胜感激!

    function MoveData() {
  // First find the correct data 

  var ss = SpreadsheetApp.getActive(); 
  var target_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('RawData');
  var allsheets = ss.getSheets();

  for(var s in allsheets){
    var source_sheet = allsheets[s];

    // Exclude sheets I don't want to copy data from 
    if(
       (source_sheet.getName() == "RawData") || 
       (source_sheet.getName() == "ProjectDB") || 
       (source_sheet.getName() == "Dashboard")  
      ) continue;

    // Find first empty row 
    var column = source_sheet.getRange('E:E');
    // NOTE that you need to put some text in to E1 or the ct variable below will stay at zero
    var values = column.getValues(); 
    var ct = 0;

    while ( values[ct] && values[ct][0] != "" ) {
      ct++;
    }  

    var source_range = source_sheet.getRange('A3:E'+(ct));  

    // Now find the right place to put it


    var last_row = target_sheet.getLastRow();
    target_sheet.insertRowAfter(last_row);
    var target_range = target_sheet.getRange("A"+(last_row+1)+":E"+(last_row+1));

    source_range.copyTo(target_range);

  }  
};

【问题讨论】:

  • 如果您提供一些示例数据,我将测试下面的功能。
  • 嗨@Cooper,非常感谢您提供的代码,但是您能否解释一下您认为我的原始代码出了什么问题以及为什么要按照您的方式编写代码?我想学习,以便我可以更好地自己调试和编写代码。谢谢!
  • 您的代码 for(var s in allsheets){ 我的 for(var i=0;i<shts.length;i++){ 我保留 for in 循环仅用于迭代键/值对象。
  • 你编码if( (source_sheet.getName() == "RawData") || (source_sheet.getName() == "ProjectDB") || (source_sheet.getName() == "Dashboard") ) continue;我的编码var exclA=["RawData","ProjectDB","Dashboard"];if(exclA.indexOf(ssh.getName())!=-1) continue;我更喜欢我的方式,因为它更容易更新文件列表而不会在以后弄乱代码。
  • 如果您有任何其他问题,请提出具体问题。

标签: google-apps-script google-sheets


【解决方案1】:
function MoveData() {
  var ss=SpreadsheetApp.getActive(); 
  var tsh=ss.getSheetByName('RawData');
  var shts=ss.getSheets();
  var exclA=["RawData","ProjectDB","Dashboard"];
  for(var i=0;i<shts.length;i++){
    var ssh=shts[i];
    if(exclA.indexOf(ssh.getName())!=-1) continue;
    // Find first empty row 
    var ch=getColumnHeight(5,ssh,ss);
    var rg=ssh.getRange(1,5,ch,1);
    var vA=rg.getValues();
    tsh.insertRowAfter(ch);
    tsh.getRange(ch+1,1);
    rg.copyTo(target_range);
  }  
}

function getColumnHeight(col,sh,ss){
  var ss=ss || SpreadsheetApp.getActive();
  var sh=sh || ss.getActiveSheet();
  var col=col || sh.getActiveCell().getColumn();
  var rg=sh.getRange(1,col,sh.getLastRow(),1);
  var vA=rg.getValues();
  while(vA[vA.length-1][0].length==0){
    vA.splice(vA.length-1,1);
  }
  return vA.length;
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 2015-10-25
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多