首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Google解析时“JavaScript运行时意外退出”错误

通过Google解析时“JavaScript运行时意外退出”错误
EN

Stack Overflow用户
提问于 2021-08-23 14:20:46
回答 3查看 420关注 0票数 1

我有一个函数getFnF(),它可以遍历Google文件夹和它的所有子文件夹。当getFnF()遇到Google文件时,我让脚本解析该Google文件,并使用我的函数getLinksFromSheet()提取出它找到的任何URL链接。这两个函数都可以工作,但是经过大约10分钟的遍历驱动器文件夹并在遇到的Google文件上调用getLinksFromSheet()之后,我得到了一个The JavaScript runtime exited unexpectedly.错误。有人知道什么会导致这个错误吗?Google文件夹相当大(子文件夹中有大约500个文件,其中75个是Google )。代码如下:

代码语言:javascript
运行
复制
function getFnF(folder) {
  var folder= folder || DriveApp.getFolderById("0AFZNRhJpE8LKUk9PVA"); //hard goded DEP-Gotham folder
  
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1');
  var files=folder.getFiles();
  
  while(files.hasNext()) {
    var file=files.next();
    var firg=sh.getRange(sh.getLastRow() + 1,level + 1);
    firg.setValue(Utilities.formatString('File: %s', file.getName()));
    Logger.log(file.getName())
    //if (file.getMimeType() == 'application/vnd.google-apps.document') {getAllLinks(file.getId(), false);};
    //if (file.getMimeType() == 'application/vnd.google-apps.presentation') {getLinksFromSlides(file.getId());};
    if (file.getMimeType() == 'application/vnd.google-apps.spreadsheet') {getLinksFromSheet(file.getId());};
  }

  var subfolders=folder.getFolders() 
  while(subfolders.hasNext()) {
    var subfolder=subfolders.next();
    var forg=sh.getRange(sh.getLastRow() + 1,level + 1);
    forg.setValue(Utilities.formatString('Fldr: %s', subfolder.getName()));
    level++;
    getFnF(subfolder);
  }

  level--;
}

function getLinksFromSheet(sheetId){
 var ss = SpreadsheetApp.openById(sheetId); 
 var sheets = ss.getSheets();
 var parentDocName = ss.getName();

 var destSs=SpreadsheetApp.getActive();
 var destSh=destSs.getSheetByName('Extracted Links');
 
 sheets.forEach(sheet => {
  var rangeData = sheet.getDataRange();
  var lastColumn = rangeData.getLastColumn();
  var lastRow = rangeData.getLastRow();
  var searchRange = sheet.getRange(1,1, lastRow, lastColumn);
  //var rangeValues = searchRange.getValues();
  var rangeValues = searchRange.getRichTextValues();


    for (var i = 0; i < lastRow; i++){
      for (var j = 0; j < lastColumn; j++){
       
        const runs = rangeValues[i][j].getRuns();

        for (const v of runs) {
           var nextLink = v.getLinkUrl();
           if (nextLink != null) {
           var row = destSh.getLastRow() + 1;
           var r1=destSh.getRange(row, 1);
           r1.setValue(parentDocName);
           var r2=destSh.getRange(row, 2);
           r2.setValue(nextLink);
           };
      }
    }
  }
});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-23 15:52:51

问题的根源很可能是超出了运行时执行的限制。

您可以使用getFilesByType进一步削减列表并节省时间。也确实修改了代码中的一些内容,但是应该能够做同样的事情。他们上面应该有评论。请查收。

用法:

代码语言:javascript
运行
复制
function getFnF(folder) {
  var folder = folder || DriveApp.getFolderById("0AFZNRhJpE8LKUk9PVA"); //hard goded DEP-Gotham folder

  var ss = SpreadsheetApp.getActive();
  var sh = ss.getSheetByName('Sheet1');
  // limit files to only google sheets
  var files = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
  
  // assign getLastRow to lessen method calls
  var lastRow = sh.getLastRow();
  // initialize level value
  var level = 1;

  while (files.hasNext()) {
    var file = files.next();
    // I can use appendRow here, but I did't since column has a variable
    // and you might change it. Feel free to update if necessary
    var firg = sh.getRange(lastRow + 1, level + 1);
    firg.setValue(Utilities.formatString('File: %s', file.getName()));
    getLinksFromSheet(file.getId()); 
    // iterate lastRow
    lastRow++;
  }

  var subfolders = folder.getFolders()
  while (subfolders.hasNext()) {
    var subfolder = subfolders.next();
    // I can use appendRow here, but I did't since column has a variable
    // and you might change it. Feel free to update if necessary
    var forg = sh.getRange(lastRow + 1, level + 1);
    forg.setValue(Utilities.formatString('Fldr: %s', subfolder.getName()));
    level++;
    getFnF(subfolder);
    // iterate lastRow
    lastRow++;
  }
  // not sure what this does but you can freely remove this if not being used
  level--;
}

function getLinksFromSheet(sheetId) {
  var ss = SpreadsheetApp.openById(sheetId);
  var sheets = ss.getSheets();
  var parentDocName = ss.getName();

  var destSs = SpreadsheetApp.getActive();
  var destSh = destSs.getSheetByName('Extracted Links');

  sheets.forEach(sheet => {
    // getDataRange already gets all the data
    var rangeData = sheet.getDataRange();
    // Flatten 2d array
    var rangeValues = rangeData.getRichTextValues().flat();
    
    rangeValues.forEach(v => {
      var link = v.getLinkUrl();
      if(link)
        // Use appendRow instead. Adjust array if needed to be in a different column.
        destSh.appendRow([parentDocName, link]);
    });
  });
}

运行时差:

6秒运行是上面的优化运行,而7秒运行是您的代码。

试验条件:

在父文件夹中有两个工作表文件,在一个sub-folder:

  • Each电子表格中有一个工作表文件,每个表有一个链接。

  • 父文件夹有一个非表文件。

注意:

  • 考虑到在较少数量的文件上存在显著的运行时差异,这肯定会对大量文件产生更大的影响。如果您希望包含其他类型的文件,则需要创建一个单独的循环来处理每个文件类型,如果每个文件的类型不同,则需要创建一个单独的循环。
  • 也可以将2个getFilesByType输出连接到一个数组中,但是从不同的文件类型获取链接可能有所不同,因此单独的循环将更加安全。
票数 0
EN

Stack Overflow用户

发布于 2021-08-23 15:36:59

为了避免您遇到的时间问题,我建议一个脚本编写所有电子表格it,然后另一个脚本向下运行,一次运行getLinksFromSheet()一行,然后标记每一行,这样您就可以重新运行它,直到完成为止。

Getrichtextvalue > getlinkURL只是慢的,你无法绕过它。

票数 0
EN

Stack Overflow用户

发布于 2022-06-27 10:22:08

我认为这也可能是内存大小,或者单一变量类型的问题中的过多数据。在启动调试会话的几秒钟后,我得到了相同的错误,但没有指示是什么导致了错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68894315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档