У меня есть имя в ячейке A2, например; A2="Жираф"
у меня есть определенная папка, в которой есть файл с именем «Жираф»
Могут ли листы Google найти файл и получить ссылку в выходной ячейке B2?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Из вашего следующего ответа,
Я не могу отблагодарить вас за то, что вы сделали это для меня. Может быть, это я делаю ошибку. Я собираюсь опубликовать ссылки на лист Google и диск ниже. Я получаю неизвестную ошибку. Ссылка на Google Sheet - docs.google.com/spreadsheets/d. /… Ссылка на папку Google Диска — Drive.google.com/drive/folders/…
Когда я увидел вашу папку, я заметил, что в вашей ситуации никаких файлов не существует, существуют только папки. В этом случае протестируйте следующий скрипт. В этом сценарии извлекаются как папки, так и файлы. Когда вы используете этот скрипт, установите триггер OnEdit в установленныйOnEdit и поместите имя папки в столбец «A». При этом ссылка на папку помещается в столбец «Б».
function installedOnEdit(e) {
const sheetName = "Sheet1"; // Please set your sheet name.
const folderId = "###"; // Please set your folder ID you want to search the files.
const { range } = e;
const sheet = range.getSheet();
if (sheet.getSheetName() != sheetName || range.columnStart != 1 || range.rowStart == 1) return;
const getFiles = (folder, obj = {}) => {
if (folder) {
const folderName = folder.getName();
const folderLink = folder.getUrl();
obj[folderName] = obj[folderName] ? [...obj[folderName], folderLink] : [folderLink];
const files = folder.getFiles();
while (files.hasNext()) {
const f = files.next();
const filename = f.getName();
const link = f.getUrl();
obj[filename] = obj[filename] ? [...obj[filename], link] : [link];
}
const subFolders = folder.getFolders();
while (subFolders.hasNext()) {
getFiles(subFolders.next(), obj);
}
}
return obj;
}
const folder = DriveApp.getFolderById(folderId);
const obj = getFiles(folder);
const filename = range.getDisplayValue().trim();
if (obj[filename]) {
range.offset(0, 1).setValue(obj[filename]);
}
}
Если вы хотите получить только папки, удалите следующий сценарий из приведенного выше сценария.
const files = folder.getFiles();
while (files.hasNext()) {
const f = files.next();
const filename = f.getName();
const link = f.getUrl();
obj[filename] = obj[filename] ? [...obj[filename], link] : [link];
}
@Vansh Shah Теперь, угадав вашу реальную ситуацию, я добавил еще один пример сценария. Пожалуйста, подтвердите это. Если мое предположение оказалось неверным, еще раз прошу прощения. Тогда предоставьте подробную информацию для правильного воспроизведения проблемы. Этим я хотел бы это подтвердить.
хорошо, у меня есть основная папка под названием «Объекты», в этой папке у меня есть 5 новых папок «Животное 1 Животное 2… Животное 5» в каждой папке «Животное» есть папки, которые называются соответственно моему A2 = «Жираф», поэтому я хочу получить ссылку на папку с названием «Жираф» из папки «Животное 1».
@Ванш Шах Спасибо за ответ. Из вашего ответа я понял, что в вашей ситуации есть папка, включающая подпапки. В этом случае можно использовать мой добавленный скрипт. Потому что в моем добавленном скрипте поиск ведется по всем подпапкам в папке. Можете ли вы протестировать мой сценарий?
Привет! Ни один из сценариев не работает. Думаю, все в порядке. Я могу просто сделать это вручную. Большое спасибо за ваши усилия в этом @Tanaike.
@Ванш Шах Спасибо за ответ. Насчет Hi, None of the script work I guess its okay I can just do it manually Thank you so much for putting your efforts in this @Tanaike, хотя из вашего вопроса я не понял, хотите ли вы использовать мой скрипт в качестве пользовательской функции, к сожалению, на текущем этапе этот процесс нельзя использовать с пользовательской функцией из-за текущей спецификации пользовательской функции. .
@Vansh Shah Если вы хотите достичь своей цели с помощью пользовательской функции, текущий ответ — нет. В этом случае необходимо запустить скрипт вручную или по триггеру OnEdit. Приношу извинения за эту ситуацию. И я глубоко извиняюсь, что не смог сразу понять ваш фактический ожидаемый результат от вашего показного вопроса. Я бы хотел больше изучать английский язык.
Нет, я думаю, вы хорошо поняли мой вопрос @Tanaike. Я просто думаю, что это невозможно сделать в таблицах Google без API. Я получаю эту ошибку: «Исключение: у вас нет разрешения на вызов DriveApp.getFolderById. Необходимые разрешения: (googleapis. com/auth/drive.readonly || googleapis.com/auth/drive) (строка 22)."
@Ванш Шах Спасибо за ответ. Да. В текущей спецификации этот процесс нельзя использовать с пользовательской функцией. Я глубоко извиняюсь за эту ситуацию. Итак, я предложил способ ручного выполнения скрипта. Например, в качестве другого подхода, когда значение помещается в столбец «A», ссылка на файл может быть автоматически помещена в столбец «B» с помощью устанавливаемого триггера OnEdit.
@Vansh Shah Теперь я добавил еще один пример сценария с использованием устанавливаемого триггера OnEdit, пожалуйста, подтвердите это.
Привет @Tanaike. Я не могу отблагодарить вас за то, что вы сделали это для меня. Может быть, это я делаю ошибку. Я собираюсь опубликовать ссылки на лист Google и проехать ниже. Я получаю неизвестную ошибку. Ссылка на лист Google- docs.google. com/spreadsheets/d/… Ссылка на папку Google Диска — drive.google.com/drive/folders/…
@Ванш Шах Спасибо за ответ. Из вашего ответа я заметил, что в вашей ситуации файлы не существуют, существуют только папки. Итак, я обновил свой ответ. Пожалуйста, подтвердите это. Новый сценарий извлекает как папки, так и файлы.
Я НЕ МОГУ ВАС ДОСТАТОЧНО СПАСИБО. Это работает. ОГРОМНОЕ СПАСИБО @Tanaike.
Это не встроенная функция ни одного из API Google. Однако при некотором знании языка программирования. Это можно легко сделать с помощью Google Sheets API и Google Drive API.
Первый пример кода дает мне ответ: Файл ${filename} не найден. даже если имя файла присутствует и идентификатор папки верен. Второй пример кода только что завершает свое выполнение, и в B2: B не выводится никаких результатов, поэтому он не может найти имя на диске.