Скрипт работает только при загрузке одного файла

#google-apps-script

#google-приложения-скрипт

Вопрос:

Когда сотрудник отправляет форму Google, этот скрипт переименовывает загруженный файл на основе информации, которую указанный сотрудник заполняет в форме. (На данный момент он извлекает их имя, идентификатор задания и адрес текущего местоположения задания, в файле всегда есть фотографии того, что они завершили на рабочей площадке.)

Однако скрипт извлекает эту информацию только в том случае, если в форму загружается один файл / изображение, а не все файлы.

Какая модификация позволит переименовать все загруженные файлы в форме.


  while (files.hasNext()) {
for (var i = 0; i < formResponses.length; i  ) {
  var formResponse = formResponses[i];
  var itemResponses = formResponse.getItemResponses();
  var itemResponseFname = itemResponses[0];
  var itemResponseLname = itemResponses[10];
  var itemResponseID = itemResponses[11];
  var itemResponsePhoto = itemResponses[13];
  
  var photoID = itemResponsePhoto.getResponse();
  var newName = itemResponseFname.getResponse()   " "   itemResponseLname.getResponse()   " - "   itemResponseID.getResponse();
  var url = baseString   photoID   endString;
  var urlCheck = file.getUrl();
  if ( url == urlCheck) {
    var modName = newName   ".jpg";
    file.setName(modName);
 

Комментарии:

1. Очевидно, вам нужно перебирать все изображения, поскольку в настоящее время это происходит только для одного.

Ответ №1:

Самый простой способ сделать это заключается в следующем:

  1. Установите триггер отправки
  2. Получить список идентификаторов отправленных файлов
  3. Измените его имя на то, что вам нравится

На практике это будет выглядеть примерно так:

 function submit(e) {
  const itemResponses = e.response.getItemResponses()
  
  // Read values
  const fname = itemResponses[0].getResponse()
  const lname = itemResponses[10].getResponse()
  const uid = itemResponses[11].getResponse()
  const imageIds = itemResponses[13].getResponse()
  
  // Iterate images
  for (let imgId of imageIds){
    const image = DriveApp.getFileById(imgId)

    // Create new filename (preserves extension)
    const filename = `${fname} ${lname} - ${uid}${getExtension(image)}`

    // Set file name
    image.setName(filename)
  }
}

/**
 * Returns the extension of a file
 * 
 * For example: A file with name 'example.json' will return '.json'.
 * 
 * @param file {DriveApp.File} File to extract the extension from
 * @returns {string} The extension with the dot.
 */
function getExtension(file) {
  // Gets the last dot and the characters that follow
  const r = /(.w )$/.exec(file.getName())

  // If it has no extension return an empty string, otherwise return the captured group
  return r === null ? '' : r[1]
}
 

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