此脚本搜索电子表格,并根据第一列中的值
将链接复制到第三列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)
有谁知道我的代码有什么问题?
由于
答案 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()
文档中看到解释:
答案 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;
}
}
}
}