Рекурсивные папки для URL-адресов файлов
Я предполагаю, что у вас есть только одна папка с именем RACINE, и в ней есть только один файл с именем "FOLLOW UP", и что лист, в котором находятся ваши данные, является самым левым листом Если предположить, что это так, то эта функция извлечет URL-адреса из ячеек = HYPERLINK (), найденных в столбце B, начиная со строки 3 и до конца листа.
Изначально я пришел к выводу, что мы ссылки в столбце B, и вам нужен список URL, так что эта функция, вероятно, не нужна вам. Пожалуйста, дайте мне знать, и я удалю его.
function getLinks() {
const folder=DriveApp.getFoldersByName("RACINE").next();//assumes only one folder with that name
const file=folder.getFilesByName("FOLLOW UP").next();//assumes only one file by that name
const ss=SpreadsheetApp.openById(file.getId());
const sh=ss.getSheets()[0];//the most left sheet in the spreadsheet
const vs=sh.getRange(3,2,sh.getLastRow()-2,1).getFormulas();
var links=[];
vs.forEach(function(r,i){
let v=r[0].match(/([^"]+)/g);
links.push(v[1]);
})
var ui=HtmlService.createHtmlOutput(links.join('<br />'));
SpreadsheetApp.getUi().showModelessDialog(ui, "URLS");
return links;//as an array
}
После того, как сделаете выводы
Я думаю, это то, что вы действительно хотите, и это список URL-адресов файлов в ваших рабочих подкаталогах, которые соответствуют определенному формату именования, как описано в следующих параграфах. Я проверил это на некоторых данных, сгенерированных с помощью двух последних функций в этом ответе. После исправления нескольких опечаток он запустил очень хороший и созданный URL в правильном месте.
Первая функция - это, в основном, стартер. Предполагается, что у вас есть только одна папка с именем "RACINE" на вашем диске Google. Он вызывает рекурсивную функцию, которая по существу просматривает все подпапки RACINE, ища файлы вида "Entry_Form_IDxxxx", где xxxx - все числа между 0-9. Когда он находит имя файла, подобное этому, он загружает этот URL в следующую пустую ячейку внизу столбца B на листе [0] «FOLLOW UP». Он также ищет подкаталоги вида «IDxxxx», где xxxx - все числа от 0 до 9. Когда он находит эти подпапки в рекурсорах, вызывая getFnF () из getFnF (). Может быть трудно следовать этому процессу, поэтому, если вы новичок в этом, вы, возможно, захотите нанять некоторых, чтобы помочь вам.
function getFileUrlsIntoB3() {
const folder=DriveApp.getFoldersByName("RACINE").next();//assumes only one folder with that name
getFnF(folder);
}
Следующая функция получает Id для последующего файла в рекурсивную функцию. так что данные могут быть записаны в самый левый лист файла «СЛЕДОВАТЬ ВВЕРХ». Он использует службу кэширования, поэтому все вызовы после первого происходят значительно быстрее, поскольку идентификатор файла берется непосредственно из кэша. Кэш будет хранить это значение до 3 минут, но вы можете изменить его, если вы будете использовать sh.
function getFollowUpId() {
const cs=CacheService.getScriptCache();
const cached=cs.get('FOLLOW UP ID');
if(cached) {
return cached;
}else{
let folder=DriveApp.getFoldersByName("RACINE").next();
let file=folder.getFilesByName("FOLLOW UP").next();
cs.put('FOLLOW UP ID',file.getId(),180);//3 minute cache time
return file.getId();
}
}
И это рекурсивная функция. Это просто означает, что это функция, которая вызывает себя.
function getFnF(folder) {
const ss=SpreadsheetApp.openById(getFollowUpId());
var sh=ss.getSheets()[0];
var files=folder.getFiles();
while(files.hasNext()) {
var file=files.next();
if(file.getName().match(/^Entry_Form_ID\d{4}/)) {
sh.getRange(getColumnHeight(2,sh,ss)+1,2).setValue(file.getUrl());
}
}
var subfolders=folder.getFolders()
while(subfolders.hasNext()) {
var subfolder=subfolders.next();
if(subfolder.getName().match(/^ID\d{4}/)) {
getFnF(subfolder);
}
}
}
И, наконец, это функция, которая вычисляет текущую высоту столбца B в листе [0] электронной таблицы "FOLLOW UP"
function getColumnHeight(col,sh,ss){
var ss=ss||SpreadsheetApp.getActive();
var sh=sh||ss.getActiveSheet();
var col=col||sh.getActiveCell().getColumn();
var v=sh.getRange(1,col,sh.getLastRow(),1).getValues().map(function(r){return r[0];});
var s=0;
var h=0;
v.forEach(function(e,i){if(e==''){s++;}else{s=0;}h++;});
return (h-s);
}
ТЕСТИРОВАНИЕ
Я использовал следующие две функции для создания некоторых папок и файлов и обнаружил, что тестирование кода было быстрым. У него было только 3 ошибки типа опечатки, а затем работал нормально. Это просто создание текстовых файлов ascii, а не электронных таблиц, но, тем не менее, это файлы.
function generateFoldersAndFiles() {
const folder=DriveApp.getFolderById('RACINE FolderId');
for(let i=0;i<4;i++) {
let subfldr=folder.createFolder(getStrings("ID",4));
for(let j=0;j<4;j++) {
subfldr.createFile(getStrings("Entry_Form_ID",4),"Text Content");
}
}
}
function getStrings(prefix,length) {
const nA=[0,1,2,3,4,5,6,7,8,9];
var s=prefix;
for(let i=0;i<length;i++) {
s+=nA[Math.floor(Math.random()*nA.length)];
}
return s;
}
Структура файла: