脚本创建错误"无法转换"

时间:2015-02-12 20:38:46

标签: javascript google-apps-script google-sheets

此脚本搜索电子表格,并根据第一列中的值

将链接复制到第三列
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.find)

有谁知道我的代码有什么问题?

由于

3 个答案:

答案 0 :(得分:0)

您可以改用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());
   }
}

答案 1 :(得分:0)

当我运行你的代码时,我在这一行收到错误:

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

您使用getRange()的错误语法。我收到了一个类似于你的错误消息。

getRange可以使用两种表示法参数,A1表示法或R1C1表示法。

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

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

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

  

开始行,开始列,要获取的行数,要获取的列数

getRange()文档中没有解释,但您可以在getSheetValues()文档中看到解释:

Google Documentation - getSheetValues

答案 2 :(得分:0)

我重构整个程序,因为它有一些设计缺陷。我设法摆脱了错误。但是,运行一段时间后,脚本将停止说它超出了运行脚本的时间。正如许多请求一样,我按照谷歌的要求设置了睡眠功能。但是,它无法完成我在电子表格中的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;
      }
     }


  }

}