google-apps-script - 在 Google Apps 脚本中,我将如何获取所有子文件夹和所有子子文件夹以及所有子子文件夹等?
问题描述
我正在尝试重命名指定文件夹中的每个文件以及所有子文件夹中的所有文件,但我不知道该怎么做。到目前为止,我有这个脚本可以重命名给定 ID 的文件夹中的每个文件,但我需要执行所有子文件夹。
function renameFilesInFolder(folderID) {
var folder = DriveApp.getFolderById(folderID)
var files = folder.getFiles(),
fileNames = []
while(files.hasNext()){
var file = files.next()
var oldFileName = file.getName()
var checkIfMatch = oldFileName.substring(oldFileName.length - 3);
var newFileName = ""
if (checkIfMatch=="OBS"){
newFileName = oldFileName
} else {
newFileName =oldFileName+"_OBS"
}
file.setName(newFileName)
Logger.log(newFileName)
}
}
解决方案
这将通过将它们写入电子表格的文件夹进行递归。
var level=0;
function getFnF(folder) {
var folder= folder || DriveApp.getRootFolder();
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('FilesAndFolders')
var files=folder.getFiles();
while(files.hasNext()) {
var file=files.next();
var firg=sh.getRange(sh.getLastRow() + 1,level + 1);
firg.setValue(Utilities.formatString('File: %s', file.getName()));
}
var subfolders=folder.getFolders()
while(subfolders.hasNext()) {
var subfolder=subfolders.next();
var forg=sh.getRange(sh.getLastRow() + 1,level + 1);
forg.setValue(Utilities.formatString('Fldr: %s', subfolder.getName()));
level++;
getFnF(subfolder);
}
level--;
}
这确实有点快
function getFnF1(folder = DriveApp.getRootFolder()) {
let tree = JSON.parse(PropertiesService.getScriptProperties().getProperty('FnF'));
//Logger.log(JSON.stringify(tree));
if (tree.level < level) {
tree.level = level;
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
}
const files = folder.getFiles();
let row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = folder.getName(); } else { x = ''; } return x; }));
tree.txt.push(row);
row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = 'bold'; } else { x = 'normal'; } return x; }));
tree.fwt.push(row);
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
if (files.hasNext()) {
let row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = 'Files:'; } else { x = ''; } return x; }));
tree.txt.push(row);
tree.fwt.push(['normal']);
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
}
while (files.hasNext()) {
let file = files.next();
let row = Array.from([...Array(level + 1).keys()], ((x, i) => { if (i == level) { x = file.getName(); } else { x = ''; } return x; }));
tree.txt.push(row);
tree.fwt.push(['normal']);
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
}
const subfolders = folder.getFolders()
while (subfolders.hasNext()) {
let subfolder = subfolders.next();
level++;
getFnF1(subfolder);
}
level--;
}
function getFilesAndFolders1() {
const fldr = DriveApp.getFolderById(gobj.globals.projectsfolderid);
const ss = SpreadsheetApp.getActive();
ss.toast("Entry");
const sh = ss.getSheetByName('Sheet1');
sh.clearContents();
SpreadsheetApp.flush();
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify({ txt: [], fwt: [], level: 0 }));
getFnF1(fldr);
//Logger.log(PropertiesService.getScriptProperties().getProperty('FnF'));
let tree = JSON.parse(PropertiesService.getScriptProperties().getProperty('FnF'));
const l = tree.level + 1
tree.txt.forEach(r => {
if (r.length < l) {
//Array.from(Array(l - r.length).keys()).forEach(e => r.push(''));
r.splice(r.length,0,...Array(l-r.length).fill(''));
}
});
tree.fwt.forEach(r => {
if (r.length < l) {
//Array.from(Array(l - r.length).keys()).forEach(e => r.push('normal'));
r.splice(r.length,0,...Array(l-r.length).fill('normal'));
}
});
//Logger.log(JSON.stringify(tree));
sh.getRange(1, 1, tree.txt.length, tree.level + 1).setValues(tree.txt);
sh.getRange(1, 1, tree.fwt.length, tree.level + 1).setFontWeights(tree.fwt);
PropertiesService.getScriptProperties().deleteProperty('FnF');
ss.toast("EOF");
}
推荐阅读
- dart - 获取包时出现“此处不允许映射值”错误
- sql-server - ALTER/CREATE 在事务中阻塞并使用环回链接服务器
- android - 如何使用外部视频播放器启动视频网址?
- linux - 无法使用eclipse调试c程序linux
- javascript - Display all pupil data from object property of school class
- reactjs - 如何在 React Typescript 中使用带有 @reach/router 的 react-pose?
- python - How to handle a KeyError when working with a list inside a list
- javascript - 查看 2 次是否与 moment.JS 重叠
- c# - 多线程 - 了解内存屏障和易失性
- python - 如何在lxml中实现自定义子元素的方法?