Как создать ярлыки из списка файлов в Google Apps Script?

Предыстория

Изначально у меня был доступ к общей папке 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 Танайке. Я отправлю свой собственный ответ с обновленным кодом.

Во-первых, я приношу свои извинения за то, что мой пример сценария оказался бесполезен в вашей ситуации. Что касается вашей ошибки Drive id not defined в моем сценарии, я извиняюсь за плохое знание английского языка. Я думаю, что причина этого в том, что вы никогда не включали Drive API. Включите Drive API в расширенных службах Google и протестируйте его еще раз. Реф По поводу вашего скрипта показа, я не смог понять ожидаемого вами результата.

Tanaike 07.02.2023 23:55

@Tanaike, я дважды проверил, включен ли Drive API, и я думаю, что это так, хотя теперь я получаю немного другую ошибку (обновлено выше). Я также обновил свой вопрос, чтобы прояснить, каким должен быть ожидаемый результат кода. Спасибо.

Mammoth 08.02.2023 00:20

Спасибо за ответ. Я приношу извинения за неудобства. Когда я протестировал свой скрипт, новый ярлык может быть создан без ошибок. Я думаю, что причина отсутствия ошибок связана с моим плохим мастерством. Прошу прощения за мой плохой навык. Но, я хотел бы поддержать вас. Итак, можете ли вы предоставить подробный алгоритм правильного воспроизведения вашей текущей проблемы? Этим я хотел бы подтвердить это. Вы правильно скопировали и вставили мой скрипт? Я беспокоюсь об этом.

Tanaike 08.02.2023 00:35

@Tanaike, не волнуйся, проблема, скорее всего, на моей стороне. Я очень новичок в кодировании в Google Scripts. Я снова скопировал и вставил ваш код и попробовал его на этой примерной файловой структуре, которую я создал. Все еще получаю ту же ошибку в строке const shortcut = Drive.Files.insert(resource);

Mammoth 08.02.2023 01:11

Спасибо за ответ. К сожалению, я все еще не могу повторить вашу ситуацию Bad Request. Прошу прощения за это. В вашей ситуации есть ли у вас разрешение на файл или папку, которые вы хотите использовать? Если у вас нет разрешения, сценарий нельзя использовать. Пожалуйста, будьте осторожны с этим.

Tanaike 08.02.2023 01:22

У меня есть разрешения, поэтому, возможно, я делаю что-то еще неправильно. Я буду продолжать работать над этим. Спасибо за помощь.

Mammoth 08.02.2023 01:46

Например, ваш целевой файл помещается на общий диск?

Tanaike 08.02.2023 01:52

Причина, по которой вы получаете указанную выше ошибку, заключается в том, что вы используете функцию createShortcut вместо функции main, это из предоставленного кода @Tanaike. Функция createShortcut ищет 3 входных параметра. Что касается вашего собственного кода, пожалуйста, укажите/уточните желаемый результат/цель, из вашего образца (ссылка на игрушечный пример) он уже содержит файлы .tiff и .jpeg.

Twilight 08.02.2023 02:29

@Twilight, обновил вопрос, чтобы, надеюсь, прояснить мой желаемый результат, и я включил свой вызов кода Танайке.

Mammoth 08.02.2023 07:17

Я могу воспроизвести вашу ошибку при запуске createShortcut function, потому что вы не можете запустить ее в одиночку без входных параметров. Его код работает и у меня: imgur.com/GXa7uwt. .

Twilight 09.02.2023 01:02

@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 09.02.2023 07:15

В дополнение к комментарию @Tanaike, я запутался в вашем новом вопросе, поскольку вы уже можете использовать его код.

Twilight 10.02.2023 01:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
12
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После множества полезных комментариев я пришел к этому уродливому, но работоспособному коду. Это работает для папки игрушечного примера, которую я разместил в своем вопросе, а также для моих реальных данных, что сложнее.

ПРИМЕЧАНИЕ: Вы должны иметь 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.

doubleunary 10.02.2023 18:32

Другие вопросы по теме

Запуск скрипта приложений, хранящегося на Google Диске, из Google Таблиц
Как автоматически установить значение в раскрывающемся списке на основе значения из другой ячейки в строке - скрипт приложения
Как прикрепить файл документа Google как документ Microsoft Word
Как автоматически обновить пользовательский интерфейс после того, как пользователь обновит userProperty в надстройках Google Apps Script Workspace для Google Sheets?
Сценарий приложения Google: вход в систему с застежкой перестал работать
Преобразование формулы «сортировки» Google Таблиц со встроенной функцией ВПР в эквивалентный скрипт приложения
Как переместить подпапку на основе значений в столбце Google Sheet?
AppsScript -> WebApp -> Прослушиватели событий не работают, если элемент добавлен после DOMContentLoaded?
Как отловить ошибку «Ваш ввод содержит более 50000 символов в одной ячейке»
Как реализовать fullStory с надстройкой Google Sheet Apps Script Add-on