#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()
его и запустите снова.