我有一个包含160个子工作表的Google工作表。所有问题均在“所有”工作表中,B列是实际的电子表格名称。以下代码是从“所有”电子表格中读取数据,并将其完美地发送到所需电子表格的最后一行,但这需要花费很长时间!可能是因为它有很多子表,并且一次又一次使用getSheetByName。现在,我一次将所有子表的名称和ID存储在“表”和“ sheetID”数组中。我想在rangeValues[j][1]
和之间进行比较sheetNames[k][0]
。下面是电子表格的代码和屏幕截图。
这是合适的方法吗?请帮助我更快地运行脚本!
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("All");
var rangeData = sheet.getDataRange();
var lastRow = rangeData.getLastRow();
var searchRange = sheet.getRange(1,1, lastRow, 8);
var curr_sheet;
function send() {
var rangeValues = searchRange.getValues();
var sheetNames = new Array();
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i=0 ; i<sheets.length ; i++) sheetNames.push( [ sheets[i].getName() ] );
//Logger.log (sheetNames.length);
var sheetID = new Array();
var sheetIDs = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i=0 ; i<sheetIDs.length ; i++) sheetID.push( [ sheetIDs[i].getSheetId() ] );
//Logger.log (sheetID.length);
for ( j = 0 ; j < lastRow; j++)
{
for ( k = 0 ; k < sheetNames.length ; k++) //
{
if (rangeValues[j][1] === sheetNames[k][0])
{
var targetSheet = ss.getSheetByName(sheetNames[k][0]); // This line is working but taking very long to complete
var targetSheet = ss.getSheetByID(sheetIDs[k][0]); // This line is not code just to show what I'm thinking to do.
targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, 8).setValues([rangeValues[j]]);
}
}
}
}
我相信您的目标如下。
getSheetByID
类电子表格中没有方法。这样,我认为您的情况下,可以删除以下脚本。
var sheetID = new Array();
var sheetIDs = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i=0 ; i<sheetIDs.length ; i++) sheetID.push( [ sheetIDs[i].getSheetId() ] );
在您的脚本中,getSheetByName
并getRange(###).setValues(###)
在循环中使用。而且,即使工作表是同一工作表,也要setValues
在循环中使用每一行。在这种情况下,处理成本将很高。我认为这些情况可能是您遇到问题的原因。
幸运的是,根据您的情况,所有工作表都在同一电子表格中。因此,为了减少脚本的处理成本,在这里,我建议使用Sheets API将值放在每个工作表中。修改后的脚本流程如下。
当以上几点反映到您的脚本时,它将变为以下内容。
请复制并粘贴以下脚本。并且,请在Advanced Google services中启用Sheets API。然后,请运行脚本。
function send() {
// 1. Retrieve Spreadsheet and values. This script is from your script.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("All");
var rangeData = sheet.getDataRange();
var lastRow = rangeData.getLastRow();
var searchRange = sheet.getRange(1,1, lastRow, 8);
var curr_sheet;
var rangeValues = searchRange.getValues();
// 2. Retrieve all sheets in the Spreadsheet.
var sheets = ss.getSheets().reduce((o, e) => Object.assign(o, {[e.getSheetName()]: e}), {});
// 3. Check whether the sheet names from the column "B" are existing.
// 4. Create the object for putting to each sheet using Sheets API.
var data = rangeValues.reduce((o, e) => {
if (sheets[e[1]]) {
if (o[e[1]]) {
o[e[1]].values.push(e);
} else {
o[e[1]] = {range: `'${e[1]}'!A${sheets[e[1]].getLastRow() + 1}`, values: [e]};
}
}
return o;
}, {});
// 5. Request the method of spreadsheets.values.batchUpdate of Sheets API using the created object.
Sheets.Spreadsheets.Values.batchUpdate({data: Object.values(data), valueInputOption: "USER_ENTERED"}, ss.getId());
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句