DocumentApp.openById()失败并显示“Service unavailable”

时间:2018-05-22 19:57:47

标签: google-apps-script google-drive-api google-docs

我正在尝试阅读包含一些folderIdfileNametargetFile的电子表格内容,然后根据电子表格中输入的数据进行阅读。

我在同一个fileId的驱动器中找到最新的fileName,因为每天都会将多个具有相同名称的文件添加到该文件夹​​中(这由函数mostRecentFiIeInFolder完成)然后我尝试将ID为dociIdSource的最新文件的内容复制到ID为docIdTarget的其他文件中(由函数docCopy完成)。

但是当我尝试使用DocumentApp实现此功能时,我收到了一个奇怪的错误,上面写着

  

服务不可用:文档

代码var baseDoc = DocumentApp.openById(docID);

我可以知道我哪里出错吗?

// Test function to call applyDocCopytoList.
function test(){
  applyDocCopytoList();
}

// Read the values from the spreadsheet.
function applyDocCopytoList(){
  var originalSpreadsheet = SpreadsheetApp.openById('sheet Id goes here').getSheetByName("sheet name goes here");
  var getRange = originalSpreadsheet.getDataRange();
  var data = originalSpreadsheet.getDataRange().getValues();
  for (var i = 1; i < data.length; i++) {
    var folderId = data[i][1];
    var fileName = data[i][2];
    var targetFile = data[i][3];

    Logger.log('****************Record No: ' + i);
    Logger.log('folderId: ' + data[i][1]);
    Logger.log('fileName: ' + data[i][2]);
    Logger.log('targetFile: ' + data[i][3]);

    var latestFileId = mostRecentFiIeInFolder(folderId, fileName);
    if(latestFileId!= undefined){
      docCopy(latestFileId, targetFile);
    }
  }
}


// Log the id of the latest file with a particular name in the folder.
function mostRecentFiIeInFolder(folderId, fileName) {
  var folder = DriveApp.getFolderById(folderId);
  Logger.log(folder);
  var files = DriveApp.getFilesByName(fileName);
  Logger.log(fileName);
  var result = [];
  // Checks whether the given file is in the folder or not
  if(!files.hasNext()){
    Logger.log('No such file in the folder with the given name');
  }
  else{
    while (files.hasNext()) {
      var file = files.next();
      result.push([file.getDateCreated(), file.getId()]);
    }
    Logger.log('************All the file ids with the same file name and their dates created************');  
    Logger.log(result);
    result.sort(function (x, y){
      var xp = x[0];// get first element in inner array
      var yp = y[0];
      return xp == yp ? 0 : xp > yp ? -1 : 1;// choose the sort order, here its in descending order of created date
    });    
    var id = result[0][1];
    Logger.log(id);
    return id;
  }
}

// Copy the contents of the latest file in the target file.
function docCopy(dociIdSource, docIdTarget){
  Logger.log('The file with id: ' + dociIdSource + ' will be copied to the target id: ' + docIdTarget);

  var docID = docIdTarget;
  var baseDoc = DocumentApp.openById(docID); //Service unavailable: Docs error is thrown for this line of code
  var body = baseDoc.getBody();

  var otherBody = DocumentApp.openById(dociIdSource).getBody();
  var totalElements = otherBody.getNumChildren();
  for( var j = 0; j < totalElements; ++j ) {
    var element = otherBody.getChild(j).copy();
    var type = element.getType();
    if( type == DocumentApp.ElementType.PARAGRAPH )
      body.appendParagraph(element);
    else if( type == DocumentApp.ElementType.TABLE )
      body.appendTable(element);
    else if( type == DocumentApp.ElementType.LIST_ITEM )
      body.appendListItem(element);
    else if( type == DocumentApp.ElementType.INLINE_IMAGE )
      body.appendImage(element);
    else if( type == DocumentApp.ElementType.TEXT ) 
      body.setText(element); 
    else
      throw new Error("According to the doc this type couldn't appear in the body: " + type);
  }
}

1 个答案:

答案 0 :(得分:1)

请注意,您的mostRecentFiIeInFolder函数实际上从不使用该文件夹,也不会检查文件的类型是否正确 - 即实际上是Google Docs文件。因此,如果您搜索到的名称应该没有找到任何内容(即目标文件夹中没有该名称的最新文件),但您的云端硬盘中的某个备用文件中有一个非Google文档文件,则您的脚本会找到它并将其视为不是它的东西。

解决方案是将搜索范围限制在所需的文件夹中,并再次通过实际的Google文档mimetype:

function testIt() {
  var folderIds = [
    "", // Search all of Drive
    "123428349djf8234", // Search that specific folder
  ];
  // Log (in Stackdriver) the file id of the most recently created Google Docs file with the name "some name" in the various folders:
  folderIds.forEach(function (folderId) {
    console.log(getMostRecentFileIdWithName("some name", folderId, MimeType.GOOGLE_DOCS));
  });
}

function getMostRecentFileIdWithName(fileName, folderId = "", mimeType = "") {
  // If a folder was given, restrict the search to that folder. Otherwise, search with
  // DriveApp. (Throws an error if the folderId is invalid.)
  var parent = folderId ? DriveApp.getFolderById(folderId) : DriveApp;

  // I assume your fileName variable does not contain any unescaped single-quotes.
  var params = "name='" + fileName + "'";
  // If a mimetype was given, search by that type only, otherwise search any type.
  if (mimeType)
    params += " and mimeType='" + mimeType + "'";
  var matches = parent.searchFiles(params),
      results = [];

  // Collect and report results.
  while (matches.hasNext())
    results.push(matches.next());
  if (!results.length)
    throw new Error("Bad search query \"" + params + "\" for folder id = '" + folderId + "'.");

  // Sort descending by the creation date (a native Date object).
  // (a - b sorts ascending by first column).
  results.sort(function (a, b) { return b.getDateCreated() - a.getDateCreated(); });
  return results[0].getId();
}

您可以在Drive REST API documentation中详细了解可接受的搜索参数,并详细了解DriveApp documentation中的Apps脚本原生实现。