【问题标题】:Removing or Ignoring Empty Cells Returned by .getRange()删除或忽略 .getRange() 返回的空单元格
【发布时间】:2019-08-23 20:50:42
【问题描述】:

所以我在工作表中有一列数据,我正在使用应用程序脚本函数对其进行迭代。

问题是我的工作表末尾有许多空单元格,当我使用.getRange() 时,它们呈现为[]

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("AUD Data");
var sheetRange = sheet.getRange("F2:F").getValues();

function logRange() {
Logger.log(sheetRange)
}

返回

我想在最后从我的单元格数组中取出所有这些空白单元格,因为当我遍历这个数组时它会弄乱结果。

已尝试filter() and isNaN,但这些解决方案均无效。

理想情况下,我想在循环之前删除空数组,但是在条件中忽略它们的方法也可以。

我发现有趣的是,即使这些空单元格显示为空数组,Apps 脚本似乎也将它们视为具有值。我的条件应该忽略imo...例如。

else if (i > 0 && sheetRange[i] <= 0 && sheetRange[i-1] <= 0)

如何将空数组视为数字?

注意:我可以通过删除工作表中的空行来解决此问题,但更愿意使用代码来解决此问题。

【问题讨论】:

  • 有哪些值类型?它们是数字还是字符串或两者兼而有之?
  • 值类型只是数字。
  • 我不确定为什么过滤器无法删除不需要的值。我没有你的数据,但它似乎对我有用。

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


【解决方案1】:

这个答案怎么样?

问题 1:

在您的电子表格中,如果所有列的最后一行都相同或“F”列的最后一行最底部,那么如何修改?

发件人:

var sheetRange = sheet.getRange("F2:F").getValues();

收件人:

var sheetRange = sheet.getRange(2, 6, sheet.getLastRow() - 1, 1).getValues();

或者如果“F”列的最后一行与其他列的最后一行不同,那么下面的修改脚本怎么样?

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("AUD Data");
var sheetRange = sheet.getRange("F2:F").getValues();
for (var i = sheetRange.length - 1; i >= 0; i--) {
  if (sheetRange[i][0]) {
    sheetRange.splice(i + 1, sheetRange.length - (i + 1));
    break;
  }
}
Logger.log(sheetRange)

或者如果你想同时删除数组中间的空元素,下面的脚本怎么样?

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("AUD Data");
var sheetRange = sheet.getRange("F2:F").getValues().filter(String);
Logger.log(sheetRange)

问题 2:

关于else if (i &gt; 0 &amp;&amp; sheetRange[i] &lt;= 0 &amp;&amp; sheetRange[i-1] &lt;= 0),从您的脚本中,我认为您可能会使用二维数组来处理这种情况。如果sheetRangegetValues()检索到的值,则为二维数组。 getRange("F2:F") 用于此目的。那么这个修改怎么样呢?

发件人:

else if (i > 0 && sheetRange[i] <= 0 && sheetRange[i-1] <= 0)

收件人:

else if (i > 0 && sheetRange[i][0] <= 0 && sheetRange[i-1][0] <= 0)

参考资料:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

【讨论】:

  • 感谢田池的详细解释。我应该是那个道歉的人……我没有意识到 .filter() 必须是 .filter(String)。我认为字符串只是一个占位符。我也会尝试删除最后一行。对于我不想删除列中间的空单元格的类似功能可能很有用。
  • @James H 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
  • @Tanaike 所以这个.filter(String) 应该接受代表。这是否像一个真实的陈述一样解决字符串?基本上TypeOf(String) == true 然后过滤掉?
  • @Jay Jordan 虽然我不确定我是否能正确理解您的问题,但这些线程对您的情况有用吗? stackoverflow.com/q/49689907stackoverflow.com/q/36232576 如果这些没有用,我深表歉意。
  • @Tanaike,我的意思是使用“谓词”而不是“代表”。是的,这些链接回答了我的问题。谢谢。
【解决方案2】:

过滤器中的所有情况都应该用一个简单的真实陈述来消除,但这会明确检查以确保这些情况都不会发生。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("AUD Data");
var sheetRange = sheet.getRange("F2:F").getValues();

sheetRange = sheetRange.filter(sheet => sheet != null && sheet != 'undefined' && sheet.trim() != '');

function logRange() {
     Logger.log(sheetRange)
}

【讨论】:

  • 箭头函数不是有效的应用脚本顺便说一句
  • 另外,getValues 返回一个数组数组(行值的列数组),所以简单的真值测试是不正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2019-07-30
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
相关资源
最近更新 更多