2014-11-10 2 views
0

У меня был скрипт Google Таблиц, который работает некоторое время (год), который должен прочитать HTML-файл из его каталога Google Диска. Код для открытия файла выглядит так:Открыть файл из сценария Google Таблиц

var myHtmlFile = UrlFetchApp.fetch("https://googledrive.com/host/0B1m........JtZzQ/myfile.htm"); 

... и я мог бы использовать HTM-файл для дальнейшего разбора.

Внезапно код выше бросает ошибку 404.

ли что-то изменилось в последнее время, останавливая меня от открытия файла?

ответ

0

Мне кажется странным, что он когда-либо работал! Если бы это было так, это, вероятно, ошибка - довольно уверен, что он никогда не собирался работать так, как с «локальными» файлами ... Я никогда не видел, чтобы он упоминал где-нибудь, что UrlFetchApp.fetch() может извлекать такие локальные файлы.

Простое исправление было бы просто использовать соответствующий полный URL файла:

var myHtmlFile = UrlFetchApp.fetch("https://googledrive.com/host/{public_folder_id}/myfile.htm"); 

Это обеспечит ваш код соответствует API и не ломается в следующий раз Google меняет что-то.

+0

Интересно, если ваш сценарий остановки рабочего должен сделать с принудительной миграцией старого листа (созданного до декабря 2013 года) на новые листы, которые начались сегодня ... – azawaza

+0

На самом деле, я прищурился при написании вопроса, параметр url в выборке был правильным URL-адресом, то есть: https: // googledrive. com/host/0B1m ........ dQ3U4eDFXNjJtZzQ/myfile.htm ", wh ere '0B1m ........ dQ3U4eDFXNjJtZzQ' является {public_folder_id} в вашем ответе, поэтому звонок был в порядке. Он просто прекратил работать сегодня, но это может быть прерывистым (как многие вещи с Диском). Я снова заново запустил его позже и увижу. – seanpj

+0

Несомненно, это временная проблема с Диском. Если проблема сохраняется не ранее чем через пару часов, это может быть что-то другое - попробуйте сохранить новую версию своего сценария и повторно разверните ее в качестве приложения (если это веб-приложение).Если это скрипт, связанный с листом, попробуйте создать новую электронную таблицу и скопируйте ее на нее, чтобы увидеть, работает ли она тогда. – azawaza

0

После обсуждения с «azawaza» (спасибо за все советы), я, наконец, решил это, поэтому я отправляю разрешение, если другие попадают в это.

Похоже конструкта

https://googledrive.com/host/{public_folder_id}/myfile.htm 

в UrlFetchApp.fetch (URL, правда) не может быть больше не используется. Это дает ошибку 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 

Я не знаю, почему «старое» решение больше не работает. Как я уже говорил, он работал целый год.

UPDATE (май 2015)
«DocsList» устарела, новая конструкция:

var files = DriveApp.getFilesByName(myURL); 
    if (files.hasNext()) { 
    var htmlCont = files.next().getBlob().getDataAsString() 
    } 

должен быть использован вместо

Смежные вопросы