use*_*868 8 google-apps-script google-drive-api
我编写了一个脚本来迭代Google云端硬盘文件夹中的大量文件.由于我对这些文件进行的处理,它超过了最大执行时间.当然,我写入脚本使用DriveApp.continueFileIterator(continuationToken):令牌存储在Project Properties中,当脚本运行时,它会检查是否有令牌,如果有则从令牌创建FileIterator,如果不是重新开始.
我发现的是,即使脚本使用延续令牌重新启动,它仍然从迭代开始时开始,尝试再次处理相同的文件,这浪费了后续执行的时间.我是否错过了一些重要的东西,如命令或方法,让它从它停止的地方开始?我是否应该在while(contents.hasNext())循环的各个阶段更新延续令牌?
这里是缩小示例代码,为您提供一个想法:
function listFilesInFolder() {
var id= '0fOlDeRiDg';
var scriptProperties = PropertiesService.getScriptProperties();
var continuationToken = scriptProperties.getProperty('IMPORT_ALL_FILES_CONTINUATION_TOKEN');
var lastExecution = scriptProperties.getProperty('LAST_EXECUTION');
if (continuationToken == null) {
// first time execution, get all files from drive folder
var folder = DriveApp.getFolderById(id);
var contents = folder.getFiles();
// get the token and store it in a project property
var continuationToken = contents.getContinuationToken();
scriptProperties.setProperty('IMPORT_ALL_FILES_CONTINUATION_TOKEN', continuationToken);
} else {
// we continue to import from where we left
var contents = DriveApp.continueFileIterator(continuationToken);
}
var file;
var fileID;
var name;
var dateCreated;
while(contents.hasNext()) {
file = contents.next();
fileID = file.getId();
name = file.getName();
dateCreated = file.getDateCreated();
if(dateCreated > lastExecution) {
processFiles(fileID);
}
}
// Finished processing files so delete continuation token
scriptProperties.deleteProperty('IMPORT_ALL_FILES_CONTINUATION_TOKEN');
var currentExecution = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd HH:mm:ss");
scriptProperties.setProperty('LAST_EXECUTION',currentExecution);
};
Run Code Online (Sandbox Code Playgroud)
Hen*_*reu 15
就像乔纳森所说的那样,你错误地比较了日期.但这不是你的脚本的主要问题,也不是你问的问题.
您遇到错误的主要概念是在执行循环之前无法保存延续令牌.获得令牌时,它会保存您当时的位置,如果您继续进行迭代,则不会保存,您将在稍后重复这些步骤,就像您正在体验一样.
要在以后获取令牌,您不能让脚本因错误而终止.您必须在5分钟内测量可以处理的文件数量,然后在此之前手动停止脚本,这样您就有机会保存令牌.
这是正确的做法:
function listFilesInFolder() {
var MAX_FILES = 20; //use a safe value, don't be greedy
var id = 'folder-id';
var scriptProperties = PropertiesService.getScriptProperties();
var lastExecution = scriptProperties.getProperty('LAST_EXECUTION');
if( lastExecution === null )
lastExecution = '';
var continuationToken = scriptProperties.getProperty('IMPORT_ALL_FILES_CONTINUATION_TOKEN');
var iterator = continuationToken == null ?
DriveApp.getFolderById(id).getFiles() : DriveApp.continueFileIterator(continuationToken);
try {
for( var i = 0; i < MAX_FILES && iterator.hasNext(); ++i ) {
var file = iterator.next();
var dateCreated = formatDate(file.getDateCreated());
if(dateCreated > lastExecution)
processFile(file);
}
} catch(err) {
Logger.log(err);
}
if( iterator.hasNext() ) {
scriptProperties.setProperty('IMPORT_ALL_FILES_CONTINUATION_TOKEN', iterator.getContinuationToken());
} else { // Finished processing files so delete continuation token
scriptProperties.deleteProperty('IMPORT_ALL_FILES_CONTINUATION_TOKEN');
scriptProperties.setProperty('LAST_EXECUTION', formatDate(new Date()));
}
}
function formatDate(date) { return Utilities.formatDate(date, "GMT", "yyyy-MM-dd HH:mm:ss"); }
function processFile(file) {
var id = file.getId();
var name = file.getName();
//your processing...
Logger.log(name);
}
Run Code Online (Sandbox Code Playgroud)
无论如何,有可能在您的运行之间创建一个文件,而您在继续迭代时却无法获得该文件.然后,通过在上次运行后保存执行时间,您也可能在下次运行时错过它.我不知道你的用例,如果最终重新处理一些文件或错过一些文件是可以接受的.如果你根本不能有任何一种情况,那么我看到的唯一解决方案是保存你已经处理过的所有文件的ID.您可能需要将它们存储在驱动器文件中,因为对于太多的ID,PropertiesService可能太小.
您的日期比较将无法按照您的方式进行。
\n\nvar currentExecution = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd HH:mm:ss");\n
Run Code Online (Sandbox Code Playgroud)\n\n将存储"2014-04-18 08:32:01"
,而文件日期file.getDateCreated()
将返回一个 Date 对象,使用<
或进行比较>
将始终返回 false。
所以我建议您将时间存储为时间戳(因为您无法存储 Date 对象),然后将其与文件创建日期的时间戳进行比较。
\n\n// stored time stamp\nvar lastExecution = scriptProperties.getProperty(\'LAST_EXECUTION\');\n\n\xe2\x80\xa6\n\ndateCreated = file.getDateCreated().getTime();\n\n\xe2\x80\xa6\n\nvar currentExecution = new Date().getTime();\nscriptProperties.setProperty(\'LAST_EXECUTION\',currentExecution);\n
Run Code Online (Sandbox Code Playgroud)\n\n该比较将如您所期望的那样进行。
\n 归档时间: |
|
查看次数: |
4866 次 |
最近记录: |