将 Google 应用脚本中的 #N/A 或 #REF 单元格替换为空白,改进查询执行
Replace #N/A or #REF cells with blank in Google App Script, improve query execution
我正在尝试用空白值替换 google sheet 中的 #N/A 或 #REF 单元格。
我不能使用 IFERROR,因为我们正在使用错误值来条件格式化可能包含错误值的单元格。
采取的步骤:
- 将原始范围sheet导入新范围
- 使用 Google 应用程序脚本将导入范围 sheet 复制到另一个
- 遍历新的 sheet 以用空白替换 #N/A 或 #REF 单元格
问题:执行仅需 5 分钟多一点的时间即可完成。 (实际 60 行 30 列 google sheet)。我怎样才能加快执行速度?
function isError_(cell) {
const errorValues = ["#N/A", "#REF"];
for (var i = 0; i < errorValues.length; ++i)
if (cell == errorValues[i])
return true;
return false;
}
function Sample()
{
var sheetName = "Sample"; // Please set the tab name you want to overwrite the data.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var final_table = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Final Sample");
// ### PASTE VALUE TO ANOTHER SHEET
sheet.getRange("A2:AP"+sheet.getLastRow()).copyTo(final_table.getRange(1,1), SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
var Avals = final_table.getRange("D2:D").getValues();
var Alast = Avals.filter(String).length;
var range = final_table.getDataRange();
var vals = range.getValues();
for (var row = 1; row <= Alast; ++row)
{
for(var col = 0; col <= final_table.getLastColumn(); ++col)
{
if (isError_(vals[row][col]))
{
var data = "";
SpreadsheetApp.getActive().getSheets()[1].getRange(row+1,col+1).setValue(data)
}
}
}
}
我认为在您的脚本中,SpreadsheetApp.getActive().getSheets()[1].getRange(row+1,col+1).setValue(data)
用于循环。我认为这可能是您遇到问题的主要原因。这样的话,工艺成本会很高。
为了降低脚本的处理成本,下面的修改怎么样?
修改后的脚本:
function Sample() {
var sheetName = "Sample";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName);
var final_table = ss.getSheetByName("Final Sample");
sheet.getRange("A2:AP" + sheet.getLastRow()).copyTo(final_table.getRange(1, 1), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
final_table.createTextFinder("#N\/A|#REF").useRegularExpression(true).matchEntireCell(true).replaceAllWith("");
}
- 在此示例中,
"#N/A", "#REF"
使用 TextFinder 替换为 ""
。
参考文献:
我正在尝试用空白值替换 google sheet 中的 #N/A 或 #REF 单元格。 我不能使用 IFERROR,因为我们正在使用错误值来条件格式化可能包含错误值的单元格。
采取的步骤:
- 将原始范围sheet导入新范围
- 使用 Google 应用程序脚本将导入范围 sheet 复制到另一个
- 遍历新的 sheet 以用空白替换 #N/A 或 #REF 单元格
问题:执行仅需 5 分钟多一点的时间即可完成。 (实际 60 行 30 列 google sheet)。我怎样才能加快执行速度?
function isError_(cell) {
const errorValues = ["#N/A", "#REF"];
for (var i = 0; i < errorValues.length; ++i)
if (cell == errorValues[i])
return true;
return false;
}
function Sample()
{
var sheetName = "Sample"; // Please set the tab name you want to overwrite the data.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var final_table = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Final Sample");
// ### PASTE VALUE TO ANOTHER SHEET
sheet.getRange("A2:AP"+sheet.getLastRow()).copyTo(final_table.getRange(1,1), SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
var Avals = final_table.getRange("D2:D").getValues();
var Alast = Avals.filter(String).length;
var range = final_table.getDataRange();
var vals = range.getValues();
for (var row = 1; row <= Alast; ++row)
{
for(var col = 0; col <= final_table.getLastColumn(); ++col)
{
if (isError_(vals[row][col]))
{
var data = "";
SpreadsheetApp.getActive().getSheets()[1].getRange(row+1,col+1).setValue(data)
}
}
}
}
我认为在您的脚本中,SpreadsheetApp.getActive().getSheets()[1].getRange(row+1,col+1).setValue(data)
用于循环。我认为这可能是您遇到问题的主要原因。这样的话,工艺成本会很高。
为了降低脚本的处理成本,下面的修改怎么样?
修改后的脚本:
function Sample() {
var sheetName = "Sample";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName);
var final_table = ss.getSheetByName("Final Sample");
sheet.getRange("A2:AP" + sheet.getLastRow()).copyTo(final_table.getRange(1, 1), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
final_table.createTextFinder("#N\/A|#REF").useRegularExpression(true).matchEntireCell(true).replaceAllWith("");
}
- 在此示例中,
"#N/A", "#REF"
使用 TextFinder 替换为""
。