Способы сократить время поиска по скрипту Google - PullRequest
0 голосов
/ 30 мая 2018

Мой код похож на механизм поиска файлов, он принимает ключевое слово, которое вы ищете, выполняет полнотекстовый поиск всех файлов на пользовательском диске Google и возвращает имя файла, источник URL и папку, отображаяэто в электронной таблице.Код:

function search(Phrase, FolderID) {
  // Prompt the user for a search term
  var searchTerm = Browser.inputBox("Enter the string to search for:");

  // Get the active spreadsheet and the active sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  // Set up the spreadsheet to display the results
  var headers = [["File Name", "Folder", "URL"]];
  sheet.clear();
  sheet.getRange("A4:C4").setValues(headers);

  // Search the files in the user's Google Drive for the search term based on if the word is included in thefile or name
  // Search Reference Guide: https://developers.google.com/apps-script/reference/drive/drive-app#searchFiles(String)
  var files = DriveApp.searchFiles("fullText contains '"+searchTerm.replace("'","\'")+"'");
  //var SearchString = 'fullText contains "' + Phrase + '" and "' + FolderID + '" in parents';
  //var files = DriveApp.searchFiles(SearchString);
  // create an array to store our data to be written to the sheet 
  var output = [];
  // Loop through the results and get the file name, URL, and Folder
  while (files.hasNext()) {
    var file = files.next();

    var name = file.getName();
    //var type = file.getMimeType(); //File type
    var url = file.getUrl();
    var folderNames = "";
    var folders = file.getParents();
    while (folders.hasNext()) {
        var folder = folders.next();
        //Logger.log(folder.getName());
        folderNames += folder.getName() + ", ";
    }
    // push the file details to our output array (essentially pushing a row of data)
    output.push([name, folderNames, url]);
  }
  // write data to the sheet
  sheet.getRange(5, 1, output.length, 3).setValues(output);
}

Я определенно новичок в программировании / скриптах Google, поэтому я просто хотел бы, чтобы некоторые предложения (если таковые имеются) помогли сократить количество времени, необходимое для выполнения кода одним прогоном и получениярезультаты, потому что в настоящее время я должен ждать 5-15 секунд для результатов.

1 Ответ

0 голосов
/ 31 мая 2018

Как насчет использования Drive API?Хотя я не уверен, полезно ли это предложение для вашей ситуации, не могли бы вы попробовать этот сценарий?Модифицированный скрипт выглядит следующим образом.При использовании этого сценария, пожалуйста, включите Drive API в Advanced Services и консоли API.

Включите Drive API v2 в Advanced Google Services

  • В редакторе сценариев
    • Ресурсы -> Расширенные службы Google
    • Включить Drive API v2

Включить Drive API на консоли API

  • В редакторе сценариев
    • Ресурсы -> Проект Cloud Platform
    • Просмотр консоли API
    • На начальном этапе нажмите Включить API и получите учетные данные, например ключи.
    • С левой стороны щелкните Библиотека.
    • В поле Поиск API и служб введите «Диск».И нажмите Drive API.
    • Нажмите кнопку Включить.
    • Если API уже включен, пожалуйста, не выключайте.

Модифицированный скрипт:

function search(Phrase, FolderID) {
  // Prompt the user for a search term
  var searchTerm = Browser.inputBox("Enter the string to search for:");

  // Get the active spreadsheet and the active sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  sheet.clear();

  // Below script was added.
  var optionalArgs = {
    q: "fullText contains '"+searchTerm.replace("'","\'")+"'",
    fields: "items(alternateLink,parents/id,title)"
  };
  var files = Drive.Files.list(optionalArgs).items; // Retrieve files by search text.
  var res = files.map(function(e){return [e.title, e.parents.map(function(f){return DriveApp.getFolderById(f.id).getName()}).join(", ") , e.alternateLink]});
  var values = [["File Name", "Folder", "URL"]];
  Array.prototype.push.apply(values, res);
  sheet.getRange(4, 1, values.length, 3).setValues(values);
}

Ссылки:

Если это не помогло в вашей ситуации, извините.

...