我尝试的第一个循环位于代码的/* */部分。第二个代码是 do while 循环。在这两种情况下,循环都会继续,不会重复嵌套循环。我不太确定我做错了什么。 while 条件可能不正确,但我担心的是内部循环的不重置。索引似乎没有重置为 0。
我正在使用 Google Apps 脚本
function getWorkingSessions() {
var api_token = "************************";
var range_start = "2019-09-01";
var range_end = "2019-09-02";
var company = "*****";
var range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Daten Papershift")
var row = range.getLastRow()+1;
var pageget = 1
var options = {
'method' : 'get',
'contentType': 'application/json',
};
/* var result = UrlFetchApp.fetch("https://app.papershift.com/public_api/v1/working_sessions?api_token=" + api_token + "&range_start=" + range_start + "&range_end=" + range_end + "&page=" + pageget + "&company_id=" + company);
if (result.getResponseCode() == 200) {
var session = JSON.parse(result.getContentText());
var params = session.working_sessions;
/* for (; page < 3; page++) {
var resultb = UrlFetchApp.fetch("https://app.papershift.com/public_api/v1/working_sessions?api_token=" + api_token + "&range_start=" + range_start + "&range_end=" + range_end + "&page=" + page + "&company_id=" + company);
var sessions = JSON.parse(resultb.getContentText());
var workingsessions = sessions.working_sessions;
var index = 0;
for (; index < workingsessions.length -1; index++ , row++) {
range.getRange(row, 1, 1, 1).setValue(workingsessions[index].id);
var datum = Utilities.formatDate(new Date(workingsessions[index].starts_at), "GMT", "dd.MM.yyyy");
range.getRange(row, 2, 1, 1).setValue(datum)
var start = Utilities.formatDate(new Date(workingsessions[index].starts_at), "GMT", "HH:mm");
range.getRange(row, 3, 1, 1).setValue(start);
var end = Utilities.formatDate(new Date(workingsessions[index].ends_at), "GMT", "HH:mm");
range.getRange(row, 4, 1, 1).setValue(end);
range.getRange(row, 5, 1, 1).setValue(workingsessions[index].location_id);
range.getRange(row, 6, 1, 1).setValue(workingsessions[index].employee_id);
};
}; */
var page = 1;
do {
var resultb = UrlFetchApp.fetch("https://app.papershift.com/public_api/v1/working_sessions?api_token=" + api_token + "&range_start=" + range_start + "&range_end=" + range_end + "&page=" + page + "&company_id=" + company);
var sessions = JSON.parse(resultb.getContentText());
var workingsessions = sessions.working_sessions;
var index = 0;
for (; index < workingsessions.length-1; index++, row++) {
range.getRange(row, 1, 1, 1).setValue(workingsessions[index].id);
var datum = Utilities.formatDate(new Date(workingsessions[index].starts_at), "GMT+2", "dd.MM.yyyy");
range.getRange(row, 2, 1, 1).setValue(datum)
var start = Utilities.formatDate(new Date(workingsessions[index].starts_at), "GMT+2", "HH:mm");
range.getRange(row, 3, 1, 1).setValue(start);
var end = Utilities.formatDate(new Date(workingsessions[index].ends_at), "GMT+2", "HH:mm");
range.getRange(row, 4, 1, 1).setValue(end);
range.getRange(row, 5, 1, 1).setValue(workingsessions[index].location_id);
range.getRange(row, 6, 1, 1).setValue(workingsessions[index].employee_id);
};
page++;
} while ( sessions.next_page != "null" );
/* } else {}; */
};
最佳答案
索引确实会变成0,尽管我理解你的疑虑,因为在for括号之外初始化条件变量(索引)并不好,并且在for内操作除了条件变量之外的其他变量也不好,你可以做到,它可以在 javascript 上运行,但是不太好。
这按预期工作,因此您的索引肯定会变为 0。
function getWorkingSessions() {
var row = 1;
do {
var index = 0;
for (; index < 6; index++, row++) {
Logger.log(row);
Logger.log(index);
};
} while ( row<5 );
/* } else {}; */
};
问题出在 while 条件上:
sessions.next_page != "null"
将始终为 true,因为 API 永远不会返回空字符串,因此称为“null”
sessions.next_page != null
当没有更多页面时,API 最终返回 null,因此该表达式并不总是为 true。 null 表示不存在任何对象值,“null”是包含单词 null 的字符串。
所以,问题是应用程序脚本环境正在进入永无止境的循环,因此,看起来它没有进入您的嵌套 for,但这是因为您的代码陷入了永无止境的循环并崩溃环境。
就这样做:
} while ( sessions.next_page != null );
你应该回到一个有限的递归世界,而不是像我们赖以生存的这种无限的资本扩张,所谓的资本主义,正在破坏我们的环境。
关于Javascript - 循环嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58823659/