Предыстория
Изначально у меня был доступ к общей папке Google Диска TIF_Images с изображениями от Image01.tif до Image1000.tif. Я провел много часов, организуя изображения, создавая ярлыки и помещая их в различные папки ярлыков, например Pictures_of_trees, Pictures_of_dogs.
Из-за институциональной политики архивирования я потерял доступ для чтения к TIF_Images, но получил доступ к JPG_Images, который содержит копии .jpg с более низким разрешением всех тех же изображений. Чтобы избежать повторной организации всех изображений вручную, я хотел использовать скрипт Google Диска, чтобы просмотреть каждую папку ярлыков .tif и переделать ярлыки с новыми версиями изображений .jpg.
Что я пытаюсь сделать
Учитывая папку на общем Google Диске с ярлыками Image01.tif и Image02.tif, код должен создать новые ярлыки для Image01.jpg и Image02.jpg в той же папке. Вот пример структуры папок, с которой я начинаю. Нужный код должен создать два новых ярлыка в папке Pictures_of_trees: ярлыки для Image01.jpg и Image02.jpg.
Я думаю, что я понял первую часть при получении всех .jpg версий изображений .tif в заданной папке, но у меня возникли проблемы с созданием ярлыков из этого списка .jpg. Я впервые использую скрипты Google или Javascript, поэтому я уверен, что этот код уродлив и неверен. Любая помощь будет оценена по достоинству.
function myFunction() {
// Get the folder with .jpg's
var jpgFolder = DriveApp.getFolderById("ID of JPG_Images folder");
// Get the target new shortcuts folder, which is just the old folder with shortcuts in it
var origFolder = DriveApp.getFolderById("ID of a shortcut folder like Pictures_of_trees");
var targetFolder = origFolder;
// Get all the .tif shortcuts out of the original shortcuts
var origFiles = origFolder.getFiles();
while(origFiles.hasNext()){
var origFile = origFiles.next();
var origName = origFile.getName()
// Swap out tif for jpg in the name
const regex = new RegExp("(?:tif)", 'gm')
var str = origName;
const subst = `jpg`;
// The substituted value will be contained in the result variable
var newName = str.replace(regex, subst);
console.info("newName", newName);
// Get the ID for the jpg image
var newFiles = jpgFolder.getFilesByName(newName)
// Probably messing up with the Class Fileiterator here. I need a Class File but not sure how to get that
// This should create a new shortcut in the folder linking back to the .jpg version of the image but the code breaks here.
newFiles.createShortcut(targetFolder)
}
}
Обратите внимание, что в приведенном выше коде createShortcut() должен ссылаться на эту функцию Google createShortcut().
Обновлено:
Благодаря щедрой помощи @Tanaike и @Twilight (см. комментарии) мне удалось заставить работать функцию createShortcut Танайке. Я отправлю свой собственный ответ с обновленным кодом.
@Tanaike, я дважды проверил, включен ли Drive API, и я думаю, что это так, хотя теперь я получаю немного другую ошибку (обновлено выше). Я также обновил свой вопрос, чтобы прояснить, каким должен быть ожидаемый результат кода. Спасибо.
Спасибо за ответ. Я приношу извинения за неудобства. Когда я протестировал свой скрипт, новый ярлык может быть создан без ошибок. Я думаю, что причина отсутствия ошибок связана с моим плохим мастерством. Прошу прощения за мой плохой навык. Но, я хотел бы поддержать вас. Итак, можете ли вы предоставить подробный алгоритм правильного воспроизведения вашей текущей проблемы? Этим я хотел бы подтвердить это. Вы правильно скопировали и вставили мой скрипт? Я беспокоюсь об этом.
@Tanaike, не волнуйся, проблема, скорее всего, на моей стороне. Я очень новичок в кодировании в Google Scripts. Я снова скопировал и вставил ваш код и попробовал его на этой примерной файловой структуре, которую я создал. Все еще получаю ту же ошибку в строке const shortcut = Drive.Files.insert(resource);
Спасибо за ответ. К сожалению, я все еще не могу повторить вашу ситуацию Bad Request. Прошу прощения за это. В вашей ситуации есть ли у вас разрешение на файл или папку, которые вы хотите использовать? Если у вас нет разрешения, сценарий нельзя использовать. Пожалуйста, будьте осторожны с этим.
У меня есть разрешения, поэтому, возможно, я делаю что-то еще неправильно. Я буду продолжать работать над этим. Спасибо за помощь.
Например, ваш целевой файл помещается на общий диск?
Причина, по которой вы получаете указанную выше ошибку, заключается в том, что вы используете функцию createShortcut вместо функции main, это из предоставленного кода @Tanaike. Функция createShortcut ищет 3 входных параметра. Что касается вашего собственного кода, пожалуйста, укажите/уточните желаемый результат/цель, из вашего образца (ссылка на игрушечный пример) он уже содержит файлы .tiff и .jpeg.
@Twilight, обновил вопрос, чтобы, надеюсь, прояснить мой желаемый результат, и я включил свой вызов кода Танайке.
Я могу воспроизвести вашу ошибку при запуске createShortcut function, потому что вы не можете запустить ее в одиночку без входных параметров. Его код работает и у меня: imgur.com/GXa7uwt. .
@Mammoth О вашем обновленном вопросе EDIT: Thanks to generous help from @Tanaike and @Twilight (see comments), I have been able to get Tanaike's createShortcut function to work. Now, I just need to figure out how to get the ID's from a string of file names and pass them to the createShortcut function., ваш первоначальный вопрос был решен, и у вас есть новый вопрос? Или вы хотите изменить свой вопрос? Могу я спросить вас о деталях вашей текущей ситуации?
В дополнение к комментарию @Tanaike, я запутался в вашем новом вопросе, поскольку вы уже можете использовать его код.



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


После множества полезных комментариев я пришел к этому уродливому, но работоспособному коду. Это работает для папки игрушечного примера, которую я разместил в своем вопросе, а также для моих реальных данных, что сложнее.
ПРИМЕЧАНИЕ:
Вы должны иметь const shortcut = Drive.Files.insert(resource, undefined, {supportsAllDrives: true}); в функции createShortcut , если ваши ярлыки находятся на общем диске .
function createShortcut(targetId, name, folderId) {
const resource = {
shortcutDetails: { targetId: targetId },
title: name,
mimeType: "application/vnd.google-apps.shortcut",
};
if (folderId) resource.parents = [{ id: folderId }];
const shortcut = Drive.Files.insert(resource, undefined, {supportsAllDrives: true});
return shortcut.id;
}
function myFunction() {
// Get the folder with .jpg's
var jpgFolder = DriveApp.getFolderById("1wugRsnTKptJzJi4_0jnreJJyBUrQ0L9I"); //ID of JPG_Images folder
// Get the folder where the shortcuts will go. This is the original folder with shortcuts in it
var origFolderID = "1su9LmBDPxt480NFeOEHUCEfRQY0hoWp3"; //ID of a shortcuts folder like Pictures_of_trees
var origFolder = DriveApp.getFolderById(origFolderID);
var targetFolderID = origFolderID;
// Get all the .tif shortcuts out of the original shortcuts
var origFiles = origFolder.getFiles();
while(origFiles.hasNext()){
var origFile = origFiles.next();
var origName = origFile.getName()
// Swap out tif for jpg in the name
const regex = new RegExp("(?:tiff)", 'gm')
var str = origName;
const subst = `jpeg`;
var newName = str.replace(regex, subst);
console.info("newName", newName);
// Get the ID for the jpg image
var newFiles = jpgFolder.getFilesByName(newName);
while (newFiles.hasNext()) {
var file = newFiles.next();
var newID = file.getId();
//console.info("newID", newID);
}
const targetId = newID; // Please set the ID of target file.
//console.info("targetId", targetId);
if (typeof newID === 'undefined'){
continue;
}
const shortcutName = newName; // Set the shortcut name. This is just the file name
//console.info("shortcutName", shortcutName);
const folderId = targetFolderID; // Set the folder ID where the created shortcut will go.
//console.info("folderId", folderId);
const id = createShortcut(targetId, shortcutName, folderId);
console.info("shortcut ID", id);
}
}
защитное кодирование вокруг них: используйте try...catch.
Во-первых, я приношу свои извинения за то, что мой пример сценария оказался бесполезен в вашей ситуации. Что касается вашей ошибки
Drive id not definedв моем сценарии, я извиняюсь за плохое знание английского языка. Я думаю, что причина этого в том, что вы никогда не включали Drive API. Включите Drive API в расширенных службах Google и протестируйте его еще раз. Реф По поводу вашего скрипта показа, я не смог понять ожидаемого вами результата.