【问题标题】:Google Sheets Script to retrieve comment, highlighted text, and document name for all documents in a folder用于检索文件夹中所有文档的注释、突出显示的文本和文档名称的 Google 表格脚本
【发布时间】:2021-07-27 03:44:21
【问题描述】:

我正在为 Google 表格编写脚本以执行以下功能:

  1. 查看特定文件夹(“此文件夹”)中的所有文档
  2. 对于每个文档,查看 cmets
  3. 对于每条评论,检索文档的名称、突出显示的文本和评论的内容
  4. 在电子表格中添加一行,其中包含文档名称、突出显示的文本和评论内容

我编写了执行 #2、#3 和 #4 的代码(即查看 cmets 并收集评论数据),但这仅适用于 ONE 文档。

function listComments() {  
 
var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();
  sheet.appendRow(["Interview", "Highlight", "Code"]);

var docId = '[document title]'; 

  var comments = Drive.Comments.list(docId);

  if (comments.items && comments.items.length > 0) {
    for (var c = 0; c < comments.items.length; c++) {
      var comment = comments.items[c];  

            data = [
                comment.fileTitle,
                comment.context.value,
                comment.htmlContent,
            ]
        sheet.appendRow(data);
    }
  }
}

下面是我尝试修改的代码,要求函数查看文件夹中的所有文档,并对所有文档执行此操作。但是,它不起作用。

我认为它可能会卡在某个地方的循环中?

function listComments() {      
var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();
  sheet.appendRow(["Interview", "Highlight", "Code"]);

var folder = DriveApp.getFolderById("[this folder]");
var contents = folder.getFiles();

var file

    if (contents.items > 0) {
    for (var i = 0; i < contents.items.length; i++) {
        file = contents[i];
        
            while (file.hasNext()) {
                var file = contents.next();
                var comments = Drive.Comments.list(file);

                    if (comments.items && comments.items.length > 0) {
                    for (var c = 0; c < comments.items.length; c++) {
                    var comment = comments.items[c];  

                        data = [
                            comment.fileTitle,
                            comment.context.value,
                            comment.htmlContent,
                        ]
                    sheet.appendRow(data);
                    }
                    }                   
            }
    }
    }
}

感谢您提供的任何帮助或见解!

【问题讨论】:

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


    【解决方案1】:

    这应该可行:

    function listComments() {
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.clear();
      sheet.appendRow(["Interview", "Highlight", "Code"]);
    
      var folder = DriveApp.getFolderById("[this folder]");
      var files = folder.getFiles();
    
      while (files.hasNext()) {
        var file = files.next();
        var comments = Drive.Comments.list(file.getId());
    
        if (comments.items && comments.items.length > 0) {
          for (var comment of comments.items) {
            data = [
              comment.fileTitle,
              comment.context.value,
              comment.htmlContent,
            ]
            sheet.appendRow(data);
          }
        }
      }
    }
    

    如果你有很多文件和很多 cmets,这个实现会更快:

    function listComments_improved() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var data = [["Interview", "Highlight", "Code"]]; // built a 2d array
    
      var files = DriveApp
        .getFolderById("[this folder]")
        .getFiles();
    
      while (files.hasNext()) {
        var comments = Drive.Comments.list(files.next().getId());
        if (!comments.items) continue;
        if (comments.items.length == 0) continue;
        comments.items.forEach(comment => {
          data.push([                                // fill the array with rows
            comment.fileTitle, 
            comment.context.value, 
            comment.htmlContent
            ]);
        });
      }
    
      sheet.clear()
        .getRange(1,1,data.length,data[0].length)
        .setValues(data);                            // set the array to the sheet
    }
    

    【讨论】:

    • 您好,当我继续编写此脚本时,我注意到另一个问题。该脚本仅检索最近的 20 个 cmets。即使文档中有超过 20 个 cmets,它也只会显示 20 个(最近写入的)。你对我如何解决这个问题有什么建议吗?
    • 嗯...听起来像是一个错误或(很可能)GAS 中的故意限制。坦率地说,我不知道如何克服它。我很高兴知道解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2012-05-23
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多