У меня уже некоторое время (год) работает скрипт Google Sheets, которому нужно прочитать файл HTML из каталога Google Диска. Код для открытия файла выглядит так:
var myHtmlFile = UrlFetchApp.fetch(«https://googledrive.com/host/0B1m. JtZzQ/myfile.htm»);
. и я мог бы использовать файл HTM для дальнейшего анализа.
Внезапно приведенный выше код выдает ошибку 404.
Изменилось ли что-нибудь в последнее время, что мешает мне открыть файл?
seanpj 11 Ноя 2014 в 02:14
2 ответа
Я нахожу странным, что это когда-либо работало раньше! Если это так, то, вероятно, это была ошибка — почти уверен, что она никогда не предназначалась для такой работы с «локальными» файлами. Я никогда не видел, чтобы где-либо упоминалось, что UrlFetchApp.fetch() может извлекать «локальные» файлы таким образом.
Простым решением было бы просто использовать правильный полный URL-адрес файла:
var myHtmlFile = UrlFetchApp.fetch(«https://googledrive.com/host//myfile.htm»);
Это гарантирует, что ваш код соответствует API и не сломается, когда Google что-то изменит в следующий раз.
Auto Fill Google Doc from Google Form Using Google Apps Script
azawaza 11 Ноя 2014 в 04:10
Интересно, ваш скрипт перестает работать из-за принудительного переноса старого листа (созданного до декабря 2013 года) на новые листы, который начался сегодня…
11 Ноя 2014 в 06:06
На самом деле, я облажался, когда писал вопрос, параметр URL-адреса в fetch был правильным URL-адресом, то есть: «googledrive.com/host/0B1m. dQ3U4eDFXNjJtZzQ/myfile.htm», где «0B1m. dQ3U4eDFXNjJtZzQ» в вашем ответе, поэтому звонок прошел нормально. Он просто перестал работать сегодня, но может быть с перебоями (как и многие другие вещи с Диском). Я перезапущу его позже и посмотрю.
11 Ноя 2014 в 06:13
Определенно это может быть просто временная проблема с Диском. Однако, если проблема не устранена в течение нескольких часов, это может быть что-то еще — попробуйте сохранить новую версию вашего скрипта и повторно развернуть ее как наше приложение (если это веб-приложение). Если это сценарий, связанный с листом, попробуйте создать новую электронную таблицу и скопировать в нее свой сценарий, чтобы проверить, будет ли он работать.
11 Ноя 2014 в 06:21
Тайна раскрыта. Я получал из конструкции, которая включала что-то вроде «var thisFile = DocsList.getFileById(SpreadsheetApp.getActive().getId())». и. «thisFile.getParents()[0]. получить идентификатор()’. Мне кажется, что «DocsList» создает идентификаторы, но, вероятно, уже недействительные. Я помню, что где-то видел, что это устарело?
11 Ноя 2014 в 07:13
DocsList не устарел — по крайней мере, пока — но это «экспериментальная» служба, что означает, что она может быть прекращена в любое время (например, Google прекратил службу ScriptDb). По всей вероятности, в конечном итоге его заменит Drive Service. Однако вернемся к вашей проблеме: может быть, у вашего файла теперь несколько родителей (по какой-то причине) и thisFile.getParents[0] больше не указывает на общую папку, а на какую-то другую папку?
Google Apps Script — Google Drive Tutorial, Files, Folders, Copy Files, DriveApp, Iterator — Part 15
11 Ноя 2014 в 07:29
После обсуждения с «азаваза» (спасибо за все советы) я, наконец, решил эту проблему, поэтому я публикую решение на случай, если другие попадут в это.
Похоже на конструкцию
https://googledrive.com/host//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())
Вместо этого следует использовать
Источник: question-it.com
Как открыть файлы Excel, которые находятся в папке на диске Google с помощью скрипта Google?
Мне нужно открыть файлы Excel в данной папке Google Drive и прочитать его данные. Для этого я использовал следующий код.
var folders = DriveApp.getFoldersByName(«Test Folder»); var foldersnext = folders.next(); var files = foldersnext.getFiles(); // get all files from folder while(files.hasNext()) < var sheets = SpreadsheetApp.openByUrl(files.next().getUrl()); // Line A >
Но это дает ошибку в «Линии А», как это;
Документ 1LDVkBTnkcY32ni9WoGDn6xHonPOX87ZV отсутствует (возможно, он был удален или у вас нет прав на чтение?)
Но когда войти идентификаторы файлов, используя,
var selectedFile = files.next(); Logger.log(selectedFile.getId());
Это дает мне ожидаемый результат. Итак, я думаю, что ошибка заключается в преобразовании файла в файл Excel. Пожалуйста, дайте мне решение, чтобы открыть несколько файлов Excel в данной папке и прочитать ее данные.
Этот проект имеет следующие области применения
- https://www.googleapis.com/auth/drive.readonly
- https://www.googleapis.com/auth/spreadsheets
user4156974 16 май ’19 в 04:23 2019-05-16 04:23
2019-05-16 04:23
1 ответ
- Вы хотите получить значения из файла Excel на вашем Google Диске.
- Файлы Excel помещаются в папку «Тестовая папка».
Если мое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как один из нескольких ответов.
Точка модификации:
- Чтобы извлечь значения из файла Excel, сначала необходимо преобразовать файл Excel в электронную таблицу Google. После преобразования значения можно получить с помощью службы электронных таблиц.
- Считается, что причина ошибки заключается в том, что файл Excel пытается открыть служба электронных таблиц.
Перед запуском скрипта:
При запуске сценария включите Drive API в Advanced Google Services следующим образом. Этот модифицированный скрипт использовал Drive API из расширенных сервисов Google.
- В редакторе сценариев
- Ресурсы -> Расширенные услуги Google
- Включить Drive API v2
Модифицированный скрипт:
Пожалуйста, измените ваш скрипт следующим образом.
while(files.hasNext()) < var sheets = SpreadsheetApp.openByUrl(files.next().getUrl()); // Line A >
Для того, чтобы:
while(files.hasNext()) < var file = files.next(); if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) < var resource = < title: file.getName(), parents: [], mimeType: MimeType.GOOGLE_SHEETS >; var spreadsheet = Drive.Files.copy(resource, file.getId()); var sheets = SpreadsheetApp.openById(spreadsheet.id); > >
Замечания:
- Если файл Excel большой, может произойти ошибка.
- Если количество файлов Excel велико, может произойти ошибка. В этом случае, пожалуйста, скажите мне.
- В этом примере сценария преобразованная электронная таблица создается в той же папке файла Excel. Если вы хотите удалить файл после получения значений, используйте Drive.Files.remove(fileId) ,
Рекомендации:
- Файлы: копия
- Файлы: удалить
- Служба электронных таблиц
Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.
Редактировать:
К сожалению, из вашего комментария я не смог понять вашу проблему. Я думаю, что это связано с моим плохим знанием английского языка. Я прошу прощения за это. Но из вашего комментария выяснилось, что мое понимание было правильным. Итак, в качестве контрольного примера, вы можете проверить следующий поток?
- Создать новую папку.
- Поместите файл Excel в созданную папку.
- Пожалуйста, скопируйте идентификатор папки. Этот идентификатор папки используется в скрипте.
- Пожалуйста, подтвердите, включен ли Drive API в Advanced Google Services.
- Запустите следующий пример сценария. Перед запуском установите идентификатор папки.
function sample() < var folderId = «###»; // Please set the folder ID. var folder = DriveApp.getFolderById(folderId); var files = folder.getFiles(); while(files.hasNext()) < var file = files.next(); if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) < var resource = < title: file.getName(), parents: [], mimeType: MimeType.GOOGLE_SHEETS >; var spreadsheet = Drive.Files.copy(resource, file.getId()); var sheet = SpreadsheetApp.openById(spreadsheet.id).getSheets()[0]; var value = sheet.getDataRange().getValues(); Logger.log(value) > > >
- Если вы видите значения файла Excel в журнале, обнаруживается, что скрипт работает.
Источник: stackru.com
Блог
Я написал автономный скрипт, развернутый как веб-приложение. Суть скрипта в том, что при нажатии на кнопку файл Google Sheet копируется в определенный каталог, затем я хочу, чтобы открылся новый файл. Мой код блокирует открытие нового файла. Части 1 и 2 в codeTest.gs работает отлично (примерно исходя из значения, связанного с нажатой кнопкой, скрипт будет искать в файле Google Sheet имя, которое нужно присвоить форме, а также местоположение, куда его нужно скопировать).
В моем коде вы заметите, что я говорю о форме, но на самом деле это файл Google Sheet (на практике файл Google Sheet — это заполняемый документ, похожий на форму).
function doGet(e) < return HtmlService.createHtmlOutputFromFile(‘page’); > function fctOpenForm(idForm)< // fonction qui va faire une copie du formulaire pour ensuite l’ouvrir (on préserve ainsi l’original) // 1 — on va chercher en fonction de l’id du formulaire le répertoire où il doit être copié // 1.1 — on «ouvre» le fichier de configuration var ssConfigId=»1AegVIBq_pOLxhCGb7qcUr-wmCFIk7KRqQ5sB3HBDU04″; var ssConfig=SpreadsheetApp.
openById(ssConfigId); var shtListeForms=ssConfig.getSheetByName(«Liste des formulaires»); // 1.2 — on identifie les lignes et colonnes importantes du tableau var derLig=ssConfig.getLastRow(); var derCol=ssConfig.
getLastColumn(); var ligEntete=fctFindLigne(shtListeForms,»Nom du formulaire»,1,derLig,1); var colNomForm=fctFindColonne(shtListeForms,»Nom du formulaire»,1,derCol,ligEntete); var colIdForm=fctFindColonne(shtListeForms,»Id du formulaire»,1,derCol,ligEntete); var colIdRepDest=fctFindColonne(shtListeForms,»Id du répertoire de destination de la copie»,1,derCol,ligEntete); // 1.3 — on cherche l’id du répertoire de destination de la copie var idRepDest=shtListeForms.getRange(fctFindLigne(shtListeForms,idForm,ligEntete,derLig,colIdForm),colIdRepDest).
getValue(); // 1.4 — on cherche le nom du formulaire var nomForm=shtListeForms.getRange(fctFindLigne(shtListeForms,idForm,ligEntete,derLig,colIdForm),colNomForm).getValue(); // 2 — on copie le formulaire var folderDest=DriveApp.getFolderById(idRepDest); var newForm=DriveApp.getFileById(idForm).makeCopy(«*» nomForm,folderDest); var newFormId=newForm.
getId(); // 3 — on ouvre le nouveau fichier créé var url=newForm.getUrl; var htmlString = «window.open(‘» url «‘);»; return HtmlService.createHtmlOutput(htmlString); >
DOCTYPE html> html> h1>Choix du formulaire h1> p>Cliquer sur le formulaire souhaité p> button value=»1uZwENM_Ilmo7hXLHNYaQP6GdJbuq8QlXkoiY0sIX8KQ» onclick=»fctGetValue(this)»>Prise de rendez-vous button> button value=»rembEnLigne» onclick=»fctGetValue(this)»>Remboursement — paiement initial en ligne button> button value=»rembComptoir» onclick=»fctGetValue(this)»>Remboursement — paiement initial au comptoir button> script> function fctGetValue(element)< var idForm=element.value; google.script.run.fctOpenForm(idForm); > script> html>
Я не присоединяюсь к вызываемым функциям, потому что они работают нормально. Действительно, если я использую logger.log (URL) для проверки значения переменной, определенной в строке 34 codeTest.gs он содержит URL-адрес созданного нового файла.
Интересно, почему последняя часть не работает:
// 3 — on ouvre le nouveau fichier créé var url=newForm.getUrl; var htmlString = «window.open(‘» url «‘);»; return HtmlService.createHtmlOutput(htmlString);
Этот фрагмент кода отлично работает, если я использую его самостоятельно в другом месте, но не здесь. Это потому, что в одном и том же скрипте вы не можете использовать HtmlService дважды?
Я ничего не смог найти об этом ограничении, но я не вижу никаких других причин.
К сожалению, я не могу поделиться с вами документами, упомянутыми в моем коде, я работаю в компании с доменом, который нельзя использовать совместно с другими учетными записями, кроме нашего.
Прошу прощения за мой английский…
Ответ №1:
Если вы просто хотите открыть указанный URL, вы можете использовать UrlFetchApp вместо этого вот так:
UrlFetchApp.fetch(url);
Ссылка
Ответ №2:
По предложению Диего я добрался до этого, и это работает :
DOCTYPE html> html> body onload=’fctOpenFile()’> h1>Choix du formulaire h1> p>Cliquer sur le formulaire souhaité p> button value=»1uZwENM_Ilmo7hXLHNYaQP6GdJbuq8QlXkoiY0sIX8KQ» onclick=»fctGo(this)»>Prise de rendez-vous button> button value=»rembEnLigne» onclick=»fctGetValue(this)»>Remboursement — paiement initial en ligne button> button value=»rembComptoir» onclick=»fctGetValue(this)»>Remboursement — paiement initial au comptoir button> body> script> function fctGo(element)< var idForm=element.value; google.script.run.
withSuccessHandler(fctOpenByUrl).fctOpenForm(idForm); > function fctOpenByUrl(url)< window.open(url); > script> html>
function doGet(e) < return HtmlService.
createHtmlOutputFromFile(‘page’); > function fctOpenForm(idForm)< // fonction qui va faire une copie du formulaire pour ensuite l’ouvrir (on préserve ainsi l’original) // 1 — on va chercher en fonction de l’id du formulaire le répertoire où il doit être copié // 1.1 — on «ouvre» le fichier de configuration var ssConfigId=»1AegVIBq_pOLxhCGb7qcUr-wmCFIk7KRqQ5sB3HBDU04″; var ssConfig=SpreadsheetApp.openById(ssConfigId); var shtListeForms=ssConfig.
getSheetByName(«Liste des formulaires»); // 1.2 — on identifie les lignes et colonnes importantes du tableau var derLig=ssConfig.getLastRow(); var derCol=ssConfig.
getLastColumn(); var ligEntete=fctFindLigne(shtListeForms,»Nom du formulaire»,1,derLig,1); var colNomForm=fctFindColonne(shtListeForms,»Nom du formulaire»,1,derCol,ligEntete); var colIdForm=fctFindColonne(shtListeForms,»Id du formulaire»,1,derCol,ligEntete); var colIdRepDest=fctFindColonne(shtListeForms,»Id du répertoire de destination de la copie»,1,derCol,ligEntete); // 1.3 — on cherche l’id du répertoire de destination de la copie var idRepDest=shtListeForms.getRange(fctFindLigne(shtListeForms,idForm,ligEntete,derLig,colIdForm),colIdRepDest).
getValue(); // 1.4 — on cherche le nom du formulaire var nomForm=shtListeForms.getRange(fctFindLigne(shtListeForms,idForm,ligEntete,derLig,colIdForm),colNomForm).getValue(); // 2 — on copie le formulaire var folderDest=DriveApp.getFolderById(idRepDest); var newForm=DriveApp.getFileById(idForm).makeCopy(«*» nomForm,folderDest); var newFormId=newForm.getId(); return newForm.getUrl(); >
Ale13, класс UrlFetchApp звучит интересно. Я тоже наведу справки.
Источник: programbox.ru