通过数组/缓存减少执行时间的代码??? Google 应用脚本
Code to reduce execution time by array / caching??? Google App Script
我正在使用以下代码来编译已从 Twitter 推文列表中分离出来的 hastags 列表。
此代码忽略主题标签单元格没有值或错误值的所有行。
function CopyProcessedHashtags() {
var sSheet = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = sSheet.getSheetByName("SortedIntoRows");
var targetSheet = sSheet.getSheetByName("HashtagsList");
var lastRow = sourceSheet.getLastRow();
for (var i = 3; i <= lastRow; i++) {
var cell = sourceSheet.getRange("E" + i);
var val = cell.getValue();
if (val != "") {
if (val != "#VALUE!") {
if (val != "#REF!") {
var sourceRange = sourceSheet.getRange("B" + i + ":" + "E" + i);
var targetRow = targetSheet.getLastRow();
targetSheet.insertRowAfter(targetRow+1);
var targetRange = targetSheet.getRange("B" + (targetRow+1));
sourceRange.copyTo(targetRange, {contentsOnly: true});
}}}}}
};
麻烦的是有时有数千行,执行时间超过 6 分钟。
我知道批处理可以减少执行时间...
例子
for (var i = 1; i <= 100; i++) {
SpreadsheetApp.getActiveSheet().deleteRow(i);
to
SpreadsheetApp.getActiveSheet().deleteRows(i, 100);
...我只是不知道如何重写我的代码以这种方式工作。
google 应用脚本还很陌生。
如果有人能在正确的方向上给我一些帮助,我将不胜感激。
谢谢!!
您可以使用 getValues()
检索范围内的所有数据并使用 Array.filter()
进行过滤。
示例:
代码:
function CopyProcessedHashtags() {
var sSheet = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = sSheet.getSheetByName("SortedIntoRows");
var targetSheet = sSheet.getSheetByName("HashtagsList");
var data = sourceSheet.getDataRange().getValues();
var filteredData = data.filter(dataRow => (dataRow[4] != "#VALUE!" && dataRow[4] != "#REF!" && dataRow[4] != ""));
targetSheet.getRange(1,1, filteredData.length, filteredData[0].length).setValues(filteredData);
}
示例数据:
输出:
参考文献:
我正在使用以下代码来编译已从 Twitter 推文列表中分离出来的 hastags 列表。
此代码忽略主题标签单元格没有值或错误值的所有行。
function CopyProcessedHashtags() {
var sSheet = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = sSheet.getSheetByName("SortedIntoRows");
var targetSheet = sSheet.getSheetByName("HashtagsList");
var lastRow = sourceSheet.getLastRow();
for (var i = 3; i <= lastRow; i++) {
var cell = sourceSheet.getRange("E" + i);
var val = cell.getValue();
if (val != "") {
if (val != "#VALUE!") {
if (val != "#REF!") {
var sourceRange = sourceSheet.getRange("B" + i + ":" + "E" + i);
var targetRow = targetSheet.getLastRow();
targetSheet.insertRowAfter(targetRow+1);
var targetRange = targetSheet.getRange("B" + (targetRow+1));
sourceRange.copyTo(targetRange, {contentsOnly: true});
}}}}}
};
麻烦的是有时有数千行,执行时间超过 6 分钟。
我知道批处理可以减少执行时间...
例子
for (var i = 1; i <= 100; i++) {
SpreadsheetApp.getActiveSheet().deleteRow(i);
to
SpreadsheetApp.getActiveSheet().deleteRows(i, 100);
...我只是不知道如何重写我的代码以这种方式工作。
google 应用脚本还很陌生。
如果有人能在正确的方向上给我一些帮助,我将不胜感激。
谢谢!!
您可以使用 getValues()
检索范围内的所有数据并使用 Array.filter()
进行过滤。
示例:
代码:
function CopyProcessedHashtags() {
var sSheet = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = sSheet.getSheetByName("SortedIntoRows");
var targetSheet = sSheet.getSheetByName("HashtagsList");
var data = sourceSheet.getDataRange().getValues();
var filteredData = data.filter(dataRow => (dataRow[4] != "#VALUE!" && dataRow[4] != "#REF!" && dataRow[4] != ""));
targetSheet.getRange(1,1, filteredData.length, filteredData[0].length).setValues(filteredData);
}
示例数据:
输出: