Как использовать глобальные переменные в скрипте Google Apps?

#google-apps-script #global-variables

Вопрос:

Я новичок в сценарии Google Apps. Я определяю locate_file функцию для получения имени каждого файла в папке New York Bike Share с помощью DriveApp.getFolderById .

 let folder
let file

function locate_file() {
  folder = DriveApp.getFolderById("162jksCkY98VeQAgnHeAzmnCVbGRKg9rd")
  .getFiles()
  
  while (folder.hasNext())  {
    file = folder.next().getName()

    console.log(file)
  }
}
 

Коды выше возвращают результат ниже в журнале выполнения:

 10:47:07 AM Info    201906-citibike-tripdata.csv
10:47:07 AM Info    201905-citibike-tripdata.csv
10:47:07 AM Info    201904-citibike-tripdata.csv
10:47:07 AM Info    201903-citibike-tripdata.csv
10:47:07 AM Info    201902-citibike-tripdata.csv
10:47:07 AM Info    201901-citibike-tripdata.csv
10:47:08 AM Notice  Execution completed
 

Поскольку я уже определил глобальную переменную folder , я планирую повторно использовать переменную в другой функции. Функция ниже предназначена только для демонстрационных целей, чтобы распечатать имя файла, хранящееся в folder переменной. Это не удалось.

 function check_files()  {
  while (folder.hasNext())  {
    file = folder.next().getName()

    console.log(file)
  }
}
 
 10:53:44 AM Notice  Execution started
10:53:45 AM Error   TypeError: Cannot read property 'hasNext' of undefined
                    check_files @ Code.gs:16

 

Ценю вашу помощь.

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

1. В вашей ситуации, как вы выполняете функцию check_files() ?

2. @Tanaike выполнить locate_file , и я ожидаю, что переменная folder будет сохранена с чем-то, а затем выполнена check_files .

3. Спасибо, что ответили. Из вашего ответа в сценарии Google Apps, после locate_file запуска с редактором сценариев, при check_files запуске с редактором сценариев значения let folder и let file очищаются. При этом возникает такая ошибка. А также, даже когда функции locate_file() и check_files() выполняются по порядку за один запуск, обработчик папок уже завершен. При этом цикл while в функции check_files() не используется. Ref Пожалуйста, будьте осторожны с этим.

4. @Tanaike не могли бы вы, пожалуйста, показать мне правильный способ заставить это работать?

5. Спасибо, что ответили. Я предложил одно направление для достижения вашей цели. Не могли бы вы, пожалуйста, подтвердить это? Если это было не то направление, которого вы ожидали, я приношу свои извинения.

Ответ №1:

Если вы хотите использовать папку в качестве глобальной переменной, в этом случае я хотел бы предложить использовать идентификатор папки в качестве глобальной переменной. Из folder folder = DriveApp.getFolderById("###").getFiles() -за итератора папок. Для этого, я думаю, можно использовать службу свойств. Когда это отражается в скрипте Google Apps, он выглядит следующим образом.

Пример сценария:

 // At first, please run this function. By this, the value of "folderId" is stored to PropertiesService.
function setGlobalVariable() {
  const folderId = "162jksCkY98VeQAgnHeAzmnCVbGRKg9rd";
  PropertiesService.getScriptProperties().setProperty("folderId", folderId);
}

// As the next step, please run this function. By this, "folderId" is retrieved from PropertiesService and it is used.
function check_files() {
  const folderId = PropertiesService.getScriptProperties().getProperty("folderId");
  if (folderId) {
    const folder = DriveApp.getFolderById(folderId).getFiles();
    while (folder.hasNext())  {
      file = folder.next().getName();
      console.log(file);
    }
  } else {
    throw new Error("No folder ID.");
  }
}
 
  • Сначала, пожалуйста, беги setGlobalVariable() . Таким образом, значение «folderId» сохраняется в службе свойств. И в качестве следующего шага, пожалуйста, бегите check_files() . Таким образом, «Идентификатор папки» извлекается из службы свойств и используется.
  • Если вы хотите изменить идентификатор папки, пожалуйста, измените setGlobalVariable() его и запустите снова.

Ссылка: