Поиск в папке Google Диск с сайта Google с использованием скрипта Apps
Я создал сайт Google, который содержит много папок на Google Диске. Всякий раз, когда я выполняю поиск с помощью функции поиска на Сайтах Google, я могу найти только те слова, которые принадлежат Сайту Google. Таким образом, папки Google Drive не включены в результаты поиска.
Во всяком случае, я искал в Интернете, и я наткнулся на этот кусок кода:
function doGet(e) {
var results = DriveApp.getFolderById('File ID').searchFiles('fullText contains "' + e.parameter.q + '"');
var app = UiApp.createApplication();
var panel = app.createVerticalPanel();
while(results.hasNext()) {
var file = results.next();
panel.add(app.createAnchor(file.getName(), file.getUrl()));
}
var scrollPanel = app.createScrollPanel(panel).setHeight(800);
app.add(scrollPanel);
return app;
}
Я могу запустить и запустить этот скрипт с помощью Google Search Appliance на сайте Google. (ссылка: сайт Google с измененной кнопкой поиска. (скрипт встроен в страницу: zoeken ==> просто добавьте "/zoeken" к URL-адресу.) Однако каждый раз, когда я выполняю поиск, я получаю ошибку TypeError. Есть ли кто-нибудь, кто может чтобы исправить приведенный выше сценарий или знает фрагмент кода, который позволит мне искать в папке Google Диска с сайта Google? Любая помощь будет высоко ценится.
2 ответа
Пытался сделать то же самое и нашел этот пост через гугл. Там было не так уж много, поэтому я подумал, что я добавлю то, что нашел. Решение Мэтта работало, за исключением того, что UiApp с тех пор обесценивается. Вот то же самое, не используя UiApp с некоторыми jquery и табличным сортировщиком моего коллеги. Надеясь, что другие могут использовать это, исправить любую проблему, которую они находят, и улучшить это еще немного.
// This code is designed to list files in a google drive folder and output the results as a table.
function doGet(e) {
var gotResults = getDriveFiles(DriveApp.getFolderById('File ID'), e.parameter.q);
var output = HtmlService.createTemplateFromFile('index.html');
output.results = gotResults;
output.query = e.parameter.q;
return output.evaluate();
}
function getDriveFiles(folder,search) {
var files = [];
var fileIt = folder.searchFiles('fullText contains "' + search + '"');;
while ( fileIt.hasNext() ) {
var f = fileIt.next();
files.push({id: f.getId(), name: f.getName(), URL: f.getUrl(), lastupdate: f.getLastUpdated(), MIME: f.getMimeType(), owner: f.getOwner(), parents: f.getParents()});
}
// Get all the sub-folders and iterate
var folderIt = folder.getFolders();
while(folderIt.hasNext()) {
fs = getDriveFiles(folderIt.next(),search);
for (var i = 0; i < fs.length; i++) {
files.push(fs[i]);
}
}
return files;
}
Вот index.html для этого
<!DOCTYPE html>
<html>
<head>
<base target="_blank">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.26.2/css/theme.blue.min.css">
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.26.2/js/jquery.tablesorter.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.26.2/js/jquery.tablesorter.widgets.min.js"></script>
</head>
<body>
<b>Search:</b> <?= query ?>
<table>
<thead>
<tr>
<th>File</th>
<th>Directory</th>
<th>Owner</th>
<th>Last Updated</th>
<th>File Type</th>
</tr>
</thead>
<tbody>
<?
for(var x=0; x<results.length; x++){
?><tr>
<td><a href="<?= results[x].URL ?>" target="_blank"><?= results[x].name ?></a></td>
<td> <? while (results[x].parents.hasNext()) { ?>
<?= results[x].parents.next().getName() ?>/
<? } ?> </td>
<td><?= results[x].owner.getName() ?></td>
<td><?= Utilities.formatDate(results[x].lastupdate, "EDT", "yyyy-MM-dd h:mm a ") ?></td>
<td><?= results[x].MIME ?></td>
</tr>
<? } ?>
</tbody>
</table>
<script>
$(document).ready(function() {
$("table").tablesorter({
theme: 'blue',
widgets: ["uitheme","zebra"],
widgetOptions : {
zebra : ["even", "odd"],
},
});
});
</script>
</body>
</html>
Вот некоторый рабочий код для поиска подпапок, а также указанной папки. Обратите внимание, что если вы ищете большой каталог, запуск займет некоторое время и будет пустым. Возможно, стоит добавить что-то вроде "обработки" уведомлений и проверки ошибок. Надеюсь, это кому-нибудь поможет. Не стесняйтесь исправлять любые ошибки или плохой код практики.
/* adapted origional code and code from here: http://qiita.com/atsaki/items/60dbdfe5ab5133a5f875 */
function doGet(e) {
var results = getDriveFiles(DriveApp.getFolderById('File Id'), e.parameter.q);
var app = UiApp.createApplication();
var panel = app.createVerticalPanel();
for(var x=0; x<results.length; x++){
panel.add(app.createAnchor(results[x].name, results[x].URL));
}
var scrollPanel = app.createScrollPanel(panel).setHeight(200);
app.add(scrollPanel);
return app;
}
function getDriveFiles(folder,search) {
var files = [];
var fileIt = folder.searchFiles('fullText contains "' + search + '"');;
while ( fileIt.hasNext() ) {
var f = fileIt.next();
files.push({id: f.getId(), name: f.getName(), URL: f.getUrl()});
}
// Get all the sub-folders and iterate
var folderIt = folder.getFolders();
while(folderIt.hasNext()) {
fs = getDriveFiles(folderIt.next(),search);
for (var i = 0; i < fs.length; i++) {
files.push(fs[i]);
}
}
return files;
}