"setOwner" не является ошибкой функции - сценарий приложения - PullRequest
1 голос
/ 28 мая 2020

новичок в Google Scripts, и я также просмотрел другие сообщения в Stack Overflow, но не смог найти хорошего ответа.

Я использую данные, собранные в Google Sheets, для поиска файла в Google Диск и передайте право собственности на файл. У меня есть форма Google, которую заполняют мои пользователи. После отправки с помощью надстройки я создаю файл на основе данных, которые были отправлены в форме. Теперь с помощью сценария я пытаюсь go собрать определенную информацию из таблиц, таких как имя, адрес электронной почты и название компании - Образец изображения данных здесь .

Что я пока есть:

function myFunction() {
//Get google sheets
  var spreadsheetId = '1WvIIoYdmuIB5BQ3KgSYOOIiEn-K_GTzCkb7rITzRFck';
  //get certain values from sheets
  var rangeName = 'MDP Form!C25:E';
  var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;
  if (!values) {
    Logger.log('No data found.');
  } else {
    Logger.log('Name, Email, Customer:');
    for (var row = 0; row < values.length; row++) {
      // Print columns C and E, which correspond to indices 0 and 4.
      Logger.log('Name: %s, Email: %s, Company: %s', values[row][0], values[row][1], values[row][2]);
      //Utilities.sleep(90000);
      //Searching through google drive 
      var name = (values[row][0]);
      var email = (values[row][1]);
      Logger.log(email);
      var company = (values[row][2]);
      var fileName = ('Mutual Delivery Plan ' + company + ' - ' + name);
      Logger.log(fileName);
      //add a 1 minute delay
      //Utilities.sleep(90000);
      //search for target folder
      var folder = DriveApp.getFolderById('1whvRupu9hWdyl2CqSF-KvdVj8VE6iiQu');
      //search for file by name within folder
      var mdpFile = folder.searchFiles(fileName);
      //transfer ownership
      mdpFile.setOwner(email);

    }
  }
}

Проблема:

Сценарий работает по большей части, за исключением того, что последняя строка «setOwner» не является функцией. Я пробовал создать для этого отдельную функцию, использовал некоторые другие предложения в других сообщениях, но все еще не могу заставить это работать. Если у кого-то есть идеи о том, чего мне здесь может не хватать, или предложения, которые были бы очень полезны. Спасибо!

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Я считаю вашей целью следующее.

  • Вы хотите передать владельца файла, когда файл с fileName находится в folder.

Для этого, как насчет этого ответа?

Пункты модификации:

Хотя вы говорите The script works for the most part except for the last line "setOwner" is not a function., если ваш сценарий в вашем вопросе является текущим сценарием, как насчет следующей модификации?

  • В вашем скрипте fileName равно 'Mutual Delivery Plan ' + company + ' - ' + name, а fileName используется с var mdpFile = folder.searchFiles(fileName);. В этом случае возникает ошибка. Потому что params из searchFiles(params) обязательно должно быть строкой запроса.
    • Я думаю, что в вашем случае это "title='" + fileName + "'".
  • Также searchFiles(fileName) возвращает FileIterator. Об этом уже упоминалось существующим ответом . Потому что на Google Диске одни и те же имена файлов могут существовать в одной и той же папке, и каждый файл управляется уникальным идентификатором. Итак, здесь необходимо изменить следующее.
    • Думаю, что в вашем случае пригодится следующий поток.
      1. Подтвердите, существует ли файл, используя hasNext().
      2. Если файл существует и владельцем является вы, владелец файла изменяется на email.

Когда указанные выше пункты отражены в вашем скрипте, измените его следующим образом.

Измененный скрипт:

От:
var mdpFile = folder.searchFiles(fileName);
//transfer ownership
mdpFile.setOwner(email);
Кому:
var mdpFile = folder.searchFiles("title='" + fileName + "'");
while (mdpFile.hasNext()) {
  var file = mdpFile.next();
  if (file.getOwner().getEmail() == Session.getActiveUser().getEmail()) {
    file.setOwner(email);
  }
}
  • Если вам не нужно проверять, являетесь ли вы владельцем, удалите if (file.getOwner().getEmail() == Session.getActiveUser().getEmail()) {.

Примечание:

  • In В этом случае, когда файл с именем fileName не существует в folder, сценарий в операторе if не запускается. Пожалуйста, будьте осторожны.
  • Кроме того, когда в folder есть несколько файлов с одинаковым именем, их владелец меняется на email.

Ссылки:

1 голос
/ 28 мая 2020

Folder.searchFiles() возвращает fileIterator, а не файл. Если это единственный файл с таким именем, вы обычно можете уйти с помощью mdpFile.next();

File Iterator

...