У меня есть электронная таблица Google, где в ячейках B4:B
есть список URL-адресов Google Диска с идентификаторами файлов в конце каждого URL-адреса (а не имени и расширения файлов). А в столбце N4:N
у меня есть список имен файлов (без расширений), которые будут использоваться для переименования файлов, URL-адреса которых в ячейкахB4:B
указывают.
Я хотел бы знать, существует ли скрипт, который может массово переименовывать имена файлов каждого из соответствующих идентификаторов в имена, расположенные в ячейкахN4:N
, сохраняя при этом расширения каждого файла.
Когда столбец станет пустым в 5 последовательных строках, скрипт должен остановиться.
Большое спасибо.
ОБНОВЛЕНИЕ: я добавил еще одну версию сценария, которая извлекает идентификаторы файлов из URL-адресов Google Диска, добавленных в ваш список ссылок (как указано в вашем вопросе).
Вы можете попробовать эти примеры сценариев:
Версия A: если в исходной таблице указаны только идентификаторы файлов.
function bulkUpdateNames(){
var sheets = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var links = sheets.getRange("B4:B").getValues(); // arrays of links
var names = sheets.getRange("N4:N").getValues(); // arrays of new file names
var blank_ctr = 0 // counter to check blank entries on the links column
for (i = 0; i < links.length; i++){
// if a link is found, changes the file name and resets the counter to 0
if (links[i] != ""){
DriveApp.getFileById(links[i]).setName(names[i]);
blank_ctr = 0; // resets the counter
}
else{
blank_ctr++;
}
// terminates the loop if 5 consecutive blanks are found
if (blank_ctr == 5){
break
}
}
}
Версия Б: если URL-адреса Google Диска вставлены в исходную таблицу.
function bulkUpdateNames(){
var sheets = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var links = sheets.getRange("B4:B").getValues().flat(); // arrays of links
var names = sheets.getRange("N4:N").getValues(); // arrays of new file names
var blank_ctr = 0 // counter to check blank entries on the links column
for (i = 0; i < links.length; i++){
// if a link is found, changes the file name and resets the counter to 0
if (links[i] != ""){
// splits the entire link and only retrieves the file ID
file_id = links[i].split("/")[5]
DriveApp.getFileById(file_id).setName(names[i]);
blank_ctr = 0; // resets the counter
}
else{
blank_ctr++;
}
// terminates the loop if 5 consecutive blanks are found
if (blank_ctr == 5){
break
}
}
}
Скрипт пройдёт по массиву ссылок и установит новое имя файла для каждой назначенной ссылки; счетчик будет увеличиваться для каждой пустой ячейки в столбце ссылки и:
Будет сброшен, если ссылка будет найдена до того, как будут найдены 5 последовательных пробелов, или;
Завершит выполнение сценария, как только будут найдены 5 последовательных пробелов.
Спасибо. Я пробую версию B, но получаю эту ошибку: Исключение: неверный аргумент: id BulkUpdateNames @ Rename Files.gs:13
Понятно, похоже, ошибка исходит от функции getFileById
. Версия B ожидает полную ссылку на файл Google Диска из электронной таблицы (из которой извлекается идентификатор файла). Таким образом, могу ли я спросить, похожа ли ссылка, которую вы используете, на эту: https://docs.google.com/spreadsheets/d/[fileID]
? Или вы используете другой формат ссылки?
Спасибо за Ваш ответ. У меня есть 3 типа URL-адресов. Первый – "drive.google.com/open?id=[fileID] ", а второй – "drive.google.com/file/d/[fileID]/view. ", а третий такой же, но с другим окончанием "drive.google.com/open?id=[fileID]/&usp=drive_fs "
Я создал столбец только с идентификаторами, и версия A работает без сбоев. Спасибо!
Попробуй это:
function bulkUpdateNames(){
const ss = SpreadsheetApp.getActive();
const sh = ss.getActiveSheet();
sh.getRange("B4:N" + sh.getLastRow()).getValues().filter(r => r[0]).forEach(r => DriveApp.getFileById(r[0]).setName(r[12]));
}
Привет. Спасибо. Я получаю эту ошибку. Исключение: непредвиденная ошибка при получении метода или свойства getFileById для объекта DriveApp.
Дайте мне знать, подходит ли это для вашего случая, или если у вас есть какие-либо другие вопросы или вопросы, не стесняйтесь спрашивать, чтобы мы могли продолжить обсуждение.