Google 将驱动器文件大小编写为电子表格 - 文件迭代器不工作
Google Script Drive File Sizes to Spreadsheet - File Iterator Not Working
我正在尝试将我在 Google 驱动器中的所有文件的列表放入 Google 电子表格中。我正在使用以下代码:
function driveFileSizes() {
var userProperties = PropertiesService.getUserProperties();
var continuationToken = userProperties.getProperty('LOG_ALL_FOLDERS_CONTINUATION_TOKEN');
var start = new Date();
var end = new Date();
var maxTime = 1000*60*4.5; // Max safe time, 4.5 mins
var file;
var value=[];
var values=[];
var sheet = SpreadsheetApp.getActive().getActiveSheet();
var lastRow = sheet.getLastRow() +1;
if (continuationToken == null) {
var files = DriveApp.getFiles();
} else {
var files = DriveApp.continueFileIterator(continuationToken);
}
while (files.hasNext() && end.getTime() - start.getTime() <= maxTime) {
file = files.next();
value[1] = file.getSize();
if(value[1]>0){
value[0]=file.getName();
values.push(value);
}
end = new Date();
}
sheet.getRange(lastRow, 1, values.length, 2).setValues(values);
if(files.hasNext()){
var continuationToken = files.getContinuationToken();
userProperties.setProperty('LOG_ALL_FOLDERS_CONTINUATION_TOKEN', continuationToken);
} else {
// Delete the token
PropertiesService.getUserProperties().deleteProperty('LOG_ALL_FOLDERS_CONTINUATION_TOKEN');
}
}
代码运行并将数据存入电子表格,但它只是一遍又一遍(数千次)相同的文件。
我做错了什么?感觉整个值数组在每个循环中都被覆盖了。
这注定是我在做傻事,但我已经见不到树木了。
问题出在你的循环中:
while (files.hasNext() && end.getTime() - start.getTime() <= maxTime) {
file = files.next();
value[1] = file.getSize();
if (value[1] > 0) {
value[0] = file.getName();
values.push(value);
}
end = new Date();
}
您在循环中存储相同的对象 value
,并分配给它的属性(而不是它)。因为你的输出充满了同一个对象,所以所有的引用都一起更新了。
您可以通过每次推送一个新对象来避免这种情况:
var fs = file.getSize();
if (fs > 0) {
values.push([file.getName(), fs]);
}
如果需要,您可以在循环外声明 fs
变量并仍然正确使用它,因为整个对象都被分配给了它,而不是它的 属性。
我正在尝试将我在 Google 驱动器中的所有文件的列表放入 Google 电子表格中。我正在使用以下代码:
function driveFileSizes() {
var userProperties = PropertiesService.getUserProperties();
var continuationToken = userProperties.getProperty('LOG_ALL_FOLDERS_CONTINUATION_TOKEN');
var start = new Date();
var end = new Date();
var maxTime = 1000*60*4.5; // Max safe time, 4.5 mins
var file;
var value=[];
var values=[];
var sheet = SpreadsheetApp.getActive().getActiveSheet();
var lastRow = sheet.getLastRow() +1;
if (continuationToken == null) {
var files = DriveApp.getFiles();
} else {
var files = DriveApp.continueFileIterator(continuationToken);
}
while (files.hasNext() && end.getTime() - start.getTime() <= maxTime) {
file = files.next();
value[1] = file.getSize();
if(value[1]>0){
value[0]=file.getName();
values.push(value);
}
end = new Date();
}
sheet.getRange(lastRow, 1, values.length, 2).setValues(values);
if(files.hasNext()){
var continuationToken = files.getContinuationToken();
userProperties.setProperty('LOG_ALL_FOLDERS_CONTINUATION_TOKEN', continuationToken);
} else {
// Delete the token
PropertiesService.getUserProperties().deleteProperty('LOG_ALL_FOLDERS_CONTINUATION_TOKEN');
}
}
代码运行并将数据存入电子表格,但它只是一遍又一遍(数千次)相同的文件。
我做错了什么?感觉整个值数组在每个循环中都被覆盖了。
这注定是我在做傻事,但我已经见不到树木了。
问题出在你的循环中:
while (files.hasNext() && end.getTime() - start.getTime() <= maxTime) {
file = files.next();
value[1] = file.getSize();
if (value[1] > 0) {
value[0] = file.getName();
values.push(value);
}
end = new Date();
}
您在循环中存储相同的对象 value
,并分配给它的属性(而不是它)。因为你的输出充满了同一个对象,所以所有的引用都一起更新了。
您可以通过每次推送一个新对象来避免这种情况:
var fs = file.getSize();
if (fs > 0) {
values.push([file.getName(), fs]);
}
如果需要,您可以在循环外声明 fs
变量并仍然正确使用它,因为整个对象都被分配给了它,而不是它的 属性。