Google Apps Script执行Script01时意外触发Script02的原因排查
问题排查:执行Script01时触发Script02代码执行的原因及修复方案
执行Script01中的list_folders_with_no_files_and_subfolders函数时,日志会先显示Script02的"Log Script 02:"相关内容,再输出Script01的日志;但执行Script02时仅显示自身日志。所有函数名称唯一,仅执行Script01的函数却触发了Script02的代码,需排查原因并修复,实现执行Script01时仅显示自身日志、不触发Script02代码的效果。
涉及的脚本文件
Script01.gs
function list_folders_with_no_files_and_subfolders() { var folders = DriveApp.getFolders(); var folderNames = []; while (folders.hasNext()) { var subFolder = folders.next(); var files = subFolder.getFiles(); var subFolders = subFolder.getFolders(); if (files.hasNext() || subFolders.hasNext() ) { continue; } var name = subFolder.getName(); folderNames.push(name); } Logger.log("Log Script 01:"); folderNames.forEach(function(name) { Logger.log(name); }); }
Script02.gs
function listAllFolders() { var rootFolder = DriveApp.getFolderById('YOUR_FOLDER_ID'); var folderNamesToCheck = []; if (rootFolder) { var folders = rootFolder.getFolders(); while (folders.hasNext()) { var subFolder = folders.next(); folderNamesToCheck.push(subFolder); listSubFolders(subFolder, folderNamesToCheck); } } return folderNamesToCheck; } function listSubFolders(folder, folderNamesToCheck) { var subFolders = folder.getFolders(); while (subFolders.hasNext()) { var subFolder = subFolders.next(); folderNamesToCheck.push(subFolder); listSubFolders(subFolder, folderNamesToCheck); } } function listEmptyFolders() { var emptyFolders = []; var folderNamesToCheck = listAllFolders(); folderNamesToCheck.forEach(function(folder) { var subFolders = folder.getFolders(); var files = folder.getFiles(); if (!files.hasNext() && !subFolders.hasNext()) { emptyFolders.push(folder.getName()); } }); return emptyFolders; } var emptyFolders = listEmptyFolders(); Logger.log("Log Script 02:"); Logger.log(emptyFolders);
原因分析
- Script02的末尾存在全局执行代码:
var emptyFolders = listEmptyFolders(); Logger.log("Log Script 02:"); Logger.log(emptyFolders);,这段代码没有包裹在任何函数内部。 - Google Apps Script的运行机制是:当项目中任意函数被执行时,所有脚本文件中的全局代码都会优先执行,之后才会运行选中的目标函数。这就是执行Script01函数时,Script02的全局代码先触发、日志先输出的核心原因。
修复方案
将Script02末尾的全局代码移到一个独立函数内部,让其仅在主动执行该函数时才会运行:
修改后的Script02示例:
function listAllFolders() { var rootFolder = DriveApp.getFolderById('YOUR_FOLDER_ID'); var folderNamesToCheck = []; if (rootFolder) { var folders = rootFolder.getFolders(); while (folders.hasNext()) { var subFolder = folders.next(); folderNamesToCheck.push(subFolder); listSubFolders(subFolder, folderNamesToCheck); } } return folderNamesToCheck; } function listSubFolders(folder, folderNamesToCheck) { var subFolders = folder.getFolders(); while (subFolders.hasNext()) { var subFolder = subFolders.next(); folderNamesToCheck.push(subFolder); listSubFolders(subFolder, folderNamesToCheck); } } function listEmptyFolders() { var emptyFolders = []; var folderNamesToCheck = listAllFolders(); folderNamesToCheck.forEach(function(folder) { var subFolders = folder.getFolders(); var files = folder.getFiles(); if (!files.hasNext() && !subFolders.hasNext()) { emptyFolders.push(folder.getName()); } }); return emptyFolders; } // 原全局代码移至此处,需执行Script02逻辑时选择该函数 function logEmptyFolders() { var emptyFolders = listEmptyFolders(); Logger.log("Log Script 02:"); Logger.log(emptyFolders); }
修改后,只有主动执行logEmptyFolders函数时,才会触发Script02的日志输出;执行Script01的函数时,不会再触发Script02的代码。
内容的提问来源于stack exchange,提问作者user22354007
相关产品推荐
相关产品推荐

