创建到电子表格创建错误中的文件的链接的脚本“;无法转换“”;

script to create a link to a file in a spreadsheet creating error "Cannot Convert"

本文关键字:创建 转换 链接 电子表格 错误 文件 脚本      更新时间:2023-10-16

此脚本搜索电子表格,并根据第一列中的值将链接复制到第三列

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var searchMenuEntries = [ {name: "Search in all files", functionName: "search"}];
  ss.addMenu("Search Document List", searchMenuEntries);
}

function lastValue(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getMaxRows();
  var values = SpreadsheetApp.getActiveSheet().getRange(column + "1:" + column + lastRow).getValues();
  for (; values[lastRow - 1] == "" && lastRow > 0; lastRow--) {}
  return values[lastRow - 1];
}
function search() {
  // Get the active spreadsheet and the active sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  // Search the files in the user's Docs List for the search term
  var startRow = 2;  // First row of data to process
  var numRows = lastValue("A");   // Number of rows to process
  // Fetch the range of cells A2:B3
  var dataRange = sheet.getRange(startRow, 1, numRows)
 // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
    var files = DocsList.find(data[i].toString());
    for (var j = 0; j < files.length; j++) {

      if (files[j].getType() == "other"){
        urlBase = "https://docs.google.com/fileview?id=";
        sheet.getRange(i, 3, 1, 1).setValue(urlBase + files[j].getId());
       }
    }

  }
}

然而,当我运行它时,我会得到以下错误:

无法在(类)中转换d59f868312238f16bd8534f61c01dd0695512d38

上面的字符串是列A中的最后一行值,我用它来检索链接(使用DocsList.fund)

有人知道我的代码出了什么问题吗?

感谢

您可以使用DriveApp。

var files = DriveApp.getFilesByName(data[i].toString());
while (files.hasNext()) {
   var file = file.getNext();
   if (file.getMimeType().indexOf("other") !== -1) {
     Logger.log(file.getUrl());
   }
}

当我运行您的代码时,我在这一行遇到了一个错误:

var dataRange = sheet.getRange(startRow, 1, numRows);

您对getRange()使用了错误的语法。我收到了一条与你类似的错误信息。

getRange可以采用两种类型的符号参数,A1符号或R1C1符号。

A1表示法是一个字符串,你必须把它放在引号里:

var cell = sheet.getRange("A1");

R1C1表示法采用四种设置。你有三个。R1C1表示法为:

起始行、起始列、要获取的行数、要获取的列数

getRange()文档中没有对此进行解释,但您可以在此处查看getSheetValues()文档中的解释:

谷歌文档-getSheetValues

我重构了整个程序,因为它有一些设计缺陷。我设法消除了错误。但是,运行一段时间后,脚本将停止表示它超过了运行脚本的时间。我按照谷歌的要求设置了睡眠功能,因为有很多请求。然而,它无法完成我在电子表格中的370行(它在318处停止)

你知道是否有任何方法可以提高我的算法的性能吗?

function search() {

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

  // Search the files in the user's Docs List for the search term

  var startRow = 2;  // First row of data to process
  var numRows = sheet.getMaxRows() ;   // Number of rows to process

  //sheet.getRange(2, 3, 1, 1).setValue(numRows.toString());

  var dataRange = sheet.getRange(startRow, 1, numRows-1)
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  k = startRow
  for (i in data) {
//    sheet.getRange(2, 3, 1).setValue(data[i].toString());
    var files = DocsList.find(data[i].toString()+".txt");
    Utilities.sleep(1000);
    for (var j = 0; j < files.length; j++) {

      if (files[j].getType() == "other"){
        urlBase = "https://docs.google.com/fileview?id=";
        sheet.getRange(k, 8, 1, 1).setValue(urlBase + files[j].getId());
        k = k+1
        break;
      }
     }

  }
}