У меня уже некоторое время (год) работает скрипт Google Sheets, которому нужно прочитать файл HTML из каталога Google Диска. Код для открытия файла выглядит так:
var myHtmlFile = UrlFetchApp.fetch("https://googledrive.com/host/0B1m........JtZzQ/myfile.htm");
... и я мог бы использовать файл HTM для дальнейшего анализа.
Внезапно приведенный выше код выдает ошибку 404.
Изменилось ли что-нибудь в последнее время, что мешает мне открыть файл?
2 ответа
Я нахожу странным, что это когда-либо работало раньше! Если это так, то, вероятно, это была ошибка - почти уверен, что она никогда не предназначалась для такой работы с "локальными" файлами... Я никогда не видел, чтобы где-либо упоминалось, что UrlFetchApp.fetch()
может извлекать "локальные" файлы таким образом.
Простым решением было бы просто использовать правильный полный URL-адрес файла:
var myHtmlFile = UrlFetchApp.fetch("https://googledrive.com/host/{public_folder_id}/myfile.htm");
Это гарантирует, что ваш код соответствует API и не сломается, когда Google что-то изменит в следующий раз.
После обсуждения с «азаваза» (спасибо за все советы) я, наконец, решил эту проблему, поэтому я публикую решение на случай, если другие попадут в это.
Похоже на конструкцию
https://googledrive.com/host/{public_folder_id}/myfile.htm
В UrlFetchApp.fetch(url, true) больше нельзя использовать. Выдает ошибку 404.
Я получил его из следующей конструкции (для простоты, предполагая, что у моей электронной таблицы есть только одна родительская папка):
...
var myId = DocsList.getFileById(SpreadsheetApp.getActive().getId());
var folderId = myId.getParents()[0].getId();
var url = "https://googledrive.com/host/" + folderId + "/myfile.htm";
// url looks like: https://googledrive.com/host/0B1m....JtZzQ/myfile.htm"
var httpResp = UrlFetchApp.fetch(url,true); //throws 404 !!!
// now, parse 'httpResp'
Решение, которое сработало для меня, состоит в том, чтобы найти файл напрямую, используя эту конструкцию (опять же, при условии, что существует только один файл с заданным именем):
var htmlCont = DocsList.find("myfile.htm")[0].getContentAsString();
// now, parse htmlCont
Я не знаю, почему «старое» решение больше не работает. Как я уже сказал, он работал в течение года.
ОБНОВЛЕНИЕ (май 2015 г.)
«Список документов» устарел, новая конструкция:
var files = DriveApp.getFilesByName(myURL);
if (files.hasNext()) {
var htmlCont = files.next().getBlob().getDataAsString()
}
Вместо этого следует использовать
Похожие вопросы
Новые вопросы
google-apps-script
Используйте для вопросов о Google Apps Script, серверной платформе Google для облачных сценариев на основе Javascript для автоматизации задач в продуктах Google и сторонних службах. Используйте в дополнение к релевантным тегам продукта (например, [google-sheets], [google-docs]) или API (например, [google-drive-api]), где это применимо.
thisFile.getParents[0]
больше не указывает на общую папку, а на какую-то другую папку?