Как получить список общих ссылок? - PullRequest
0 голосов
/ 26 февраля 2020

Ниже приведены все файлы в формате Google Sheet .

Моя проблема: Моя рабочая среда структурирована следующим образом ( папок / суб -фолдер ):

RACINE:
-> ID4522
-> ID7852
-> ID5864
-> ....

Файл отслеживания "FOLLOW_UP" находится в папке RACINE. Папки ID4522, ID7852 и ID5864 являются подпапками папки RACINE.

Мы находим в подпапке ID4522 следующий файл листа Google "Entry_Form_ID4522", в подпапке ID7852 следующий файл листа Google "Entry_Form_ID7852 ",…

Важное уточнение: Количество вложенных файлов (в форме" IDxxxx ") может изменяться в любое время без предупреждения.

My wi sh

Скорее всего с помощью макроса в javascript, получить в файле отслеживания ("FOLLOW_UP") из ячейки B3 и ниже список общих ссылок для каждого из файлов "Entry_Form_IDxxxx". Список подпапок может измениться в любое время (например, когда мой клиент добавляет папку со связанным файлом "Entry_Form_IDxxxx").

Заранее спасибо.

С уважением. Жером

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Рекурсивные папки для 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;
}

Структура файла:

enter image description here

0 голосов
/ 28 февраля 2020

Да, есть только одна папка с именем RACINE и один файл с именем "FOLLOW_UP". Я не понимаю кстати, что может быть несколько папок и несколько файлов с одинаковым именем? Напоминаю, что я не разработчик.

Имена подпапок (типа IDxxxx) также уникальны. Я указываю, что имя подпапок также может принимать форму IDxxxx_x (например, ID4522_1).

Все подпапки IDxxxx и IDxxxx_x находятся в папке RACINE.

Существует Файл Entry_Form_IDxxxx (или Entry_Form_IDxxxx_x) в каждой подпапке IDxxxx (и IDxxxx_x). Существует только один файл Entry_Form_IDxxxx и Entry_Form_IDxxxx_x.

Например, в подпапке ID4522 есть файл "Entry_Form_ID4522" (есть только один файл "Entry_Form_ID4522"). Например, в подпапке ID4522_1 находится файл "Entry_Form_ID4522_1" (имеется только один файл "Entry_Form_ID4522_1").

В каждой папке IDxxxx или IDxxxx_x имеется только один файл Entry_Form _...

Я хотел бы сделать скриншоты, чтобы лучше объяснить мою проблему, но я не знаю, как это сделать?

Файл, в котором я хотел бы получить результаты (то есть общие ссылки файлы "Entry_Form_IDxxxx") называются "FOLLOW_UP" (вкладка "feuille 1").

В файле "FOLLOW_UP" (вкладка "feuile 1") вот что я хотел бы получить:

Например, в ячейке B3: https://docs.google.com/spreadsheets/d/1VUf_t1gkv2lddfgsfgds7UhJeunrNzo2-QGcRe24/edit?usp=sharing

Эта ссылка будет соответствовать ссылке первого найденного файла, например "Entry_Form_ID4522"

In ячейка B4: https://docs.google.com/spreadsheets/d/1VUf_jkghkdxjfghgjgjzo2-QGcRe24/edit?usp=sharing

Эта ссылка будет соответствовать ссылке второго найденного файла, например "Entry_Form_ID7852"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...