【问题标题】:For loop with IF statement will not exit带有 IF 语句的 for 循环不会退出
【发布时间】:2018-08-28 18:05:19
【问题描述】:

我正在尝试创建一个应用程序脚本项目,该项目从列表中获取 MySQL 查询并执行它们。

列表中最后一个单元格包含单词“EXIT”。
我的意图是使用 If break 退出 for 循环。

它正在处理更新查询并执行它们,但不会退出循环继续

任何指导将不胜感激。

Logger.log(ipAddress)
Logger.log(userPassword)
Logger.log(user)
Logger.log(dbUrl)


var connection = Jdbc.getConnection(dbUrl, user, userPassword);
var stmt = connection.createStatement()

Logger.log(connection);

for (var i = 2;; i++) {
    var queryCell = querySheet.getRange(i, 1).getValue();

    Logger.log(queryCell);

    if (queryCell == "EXIT") {
        log.setValue(queryCell);
        break;
    }

    var rs = stmt.executeUpdate(queryCell);
}

rs.close();
stmt.close();
connection.close();
Logger.log("Loop Exited")

var toast = SpreadsheetApp.getActiveSpreadsheet().toast('Complete', 'Status', 10);

var time = new Date();
loadEndCell.setValue(time);

【问题讨论】:

  • 您是否收到任何错误消息? log 是什么?
  • "Exceeded maximum execution time" 这是 google 提供的允许 gs 脚本的最长时间的错误。所以它会在 5 分钟左右后超时。日志反映查询正在执行,它肯定没有离开循环
  • 您确定字符串是EXIT 而不是exit 尝试记录您的所有行。假设您有 100 行将 for 循环设置为 for (var i = 2; i <101; i++) 并记录每个单元格。
  • 是的,它是“退出”。我正在通过它运行大约 5k 个查询。我也可以看到他们从工作台进入数据库。有时由于某种原因没有完成所有这些。
  • 我的意思是也许它的格式使它变成大写你的单元格中有公式吗? @TheWizEd 也为您提供了一个很好的解决方案;

标签: mysql jdbc google-apps-script google-sheets


【解决方案1】:

改用这样的方法。每个 getValue()/setValue() 都是对服务器的调用,会影响性能。最好使用getValues()/setValues()。

  var queryData = querySheet.getDataRange().getValues();
  for( var i=1; i<queryData.length; i++ ) {
    Logger.log(queryData[i][0]);
    if( queryData[i][0] === "EXIT" ) {
      break;
    }
  }

【讨论】:

  • 在 TheWizEd 循环中我应该将 updateQuery 函数放在哪里?
  • 您可以通过一些链接和最佳实践说明来改进此答案:)
  • @Jake,什么是 updateQuery 函数?而不是 queryCell 使用 queryData[i][0]
  • SQL 语句,getDataRange 和 getValues 的数据范围也要定义吗?或者保持原样。
  • @Jake、getValues() 和 getDataRange() 是不带参数的方法。 getDataRange() 与 getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()) 相同。在我看来,Spreadsheet 属性和方法的最佳描述来源是developers.google.com/apps-script/reference/spreadsheet