【问题标题】:Search files in Google Drive and dynamic hyperlink to google sheet with google app script在 Google Drive 中搜索文件并使用 google app 脚本搜索到 google sheet 的动态超链接
【发布时间】:2018-10-27 11:16:57
【问题描述】:

我一直在努力寻找解决方案,但现在是时候寻求帮助了 :)

目标:根据文档的名称,将 G Drive 中存储的特定 PDF 文档的超链接添加到 google sheet 列中的所有单个单元格。

我更好地解释自己。这里有截图:

图纸布局

我正在尝试将 A 列中的单元格内容替换为超链接(保持链接标签不变)。超链接应指向 google 驱动器中的文档,其中文件名包含此电子表格中相关单元格中显示的名称。

函数应该在(对于列 A 的每个值)查找 G Drive 文件夹中的文件(所有文档都在其中),其名称包含该值单元格的(单元格只有发票编号,如屏幕截图中的那个,而文件还有“Invoice-”在编号前并以“.pdf”结尾)。如果匹配,则应将每个单元格值替换为指向相关文档的超链接,同时将单元格值保持为链接标签。

抱歉,描述太长了。

我能够创建一个完全满足我需要的一行的函数。对我来说,问题是要了解如何为每一行执行此操作,以及如何与谷歌驱动器中的相关文档进行“搜索和匹配”。

  function invoiceLinking() {

    var ss = SpreadsheetApp.getActiveSpreadsheet();

    // set active sheet to the second tab of the spreadsheet
    var activeSheet = ss.getSheets()[1]; 

    var data = activeSheet.getDataRange().getValues();
    var invoiceNumber = activeSheet.getRange(2,1).getValue();

    // get the drive folder containing the invoices by ID
    var folder = DriveApp.getFolderById("----Folder ID ----"); 
    var files = folder.getFiles(); 

    while (files.hasNext()) {
      var file = files.next();
      var fullname = file.getName();
      var url = file.getUrl();     
    }

      // check if the number of the invoice in the cell is contained in the name of the PDF file in the folder
      // applies an hyperlink to the realitve PDF to the cell with invoice number
      if (fullname.indexOf(invoiceNumber) !== -1 ) { 
        activeSheet.getRange(2,1).setValue('=HYPERLINK("'+url+'","'+invoiceNumber+'")'); 
      }
  }

【问题讨论】:

  • 在while循环中创建一个包含{fullname: "url"}的临时对象。然后你可以在临时对象中查找'Invoice'+fullname+'.pdf' 的url。
  • 感谢@TheMaster 的帮助!请原谅我的无知(我正在学习 JS 和 Google 脚本),但我不认为我在关注你。你能详细说明你的答案吗?谢谢大佬!

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


【解决方案1】:

目标:

  • 将工作表单元格的发票名称链接到云端硬盘 PDF

流程:

  • 使用临时对象存储 Drive PDF 名称和 URL,以便以后查找所有单元格数据

代码片段:

var range = activeSheet.getRange(2, 1, activeSheet.getLastRow() - 1, 1); //A2:A8
var invoiceNumbers = range.getValues();

var nameUrl = {}; //Object to hold name and Url

/*Fill the nameUrl*/
while (files.hasNext()) {
  var file = files.next();
  var fullname = file.getName();
  var url = file.getUrl();
  nameUrl[fullname] = url;
}

var links = invoiceNumbers.map(function(e) {
  return [
    '=HYPERLINK("' + nameUrl['Invoice-' + e[0] + '.pdf'] + '","' + e[0] + '")'
  ];
});
range.setValues(links);

参考资料:

【讨论】:

  • 非常感谢@TheMaster 我非常感谢您的解释!我完全错过了理解 map() 方法的重要性,它正在解决我正在处理的其他脚本的多种情况;)
  • 我唯一需要改变的就是将链接数组转换为二维数组,因为 setValues() 只需要两个二维数组
  • @g.n 是的。我刚刚在您的第一条评论中注意到它,并且在您最后一条评论之前已经编辑了我的答案;)
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多