获取值跳过错误

露水x19

我目前正在学习Google应用脚本,遇到一个小问题。

背景:我正在从API提取数据,并将其写入电子表格(大多数情况下工作正常),然后对数据进行一些处理。

在某些情况下,由于某种原因,导入无法正常工作。(单元格值:#ERROR!)在这种情况下,我做了一个“复制”功能,将API数据复制到另一张纸上,从而跳过了错误。因此,如果1次导入中断,我可以使用最后一次成功导入。

问题:对于一张纸,运行时间太高,所以我更改了以下代码:

function copy() {
  var copyWert = ""; 
  for (var i = 3; i < 247; i++) { 
    for (var j = 1; j < 4;j++) {
      copyWert = SpreadsheetApp.getActive().getSheetByName('API').getRange(i, j).getValue();
      if (copyWert == "#ERROR!" || copyWert == "" || copyWert == "#NAME!") {
        
      } else {
        SpreadsheetApp.getActive().getSheetByName('Copy').getRange(i, j).setValue(copyWert);
      }
    }
  }
}

至:

function copy() {
  var values = SpreadsheetApp.getActiveSheet().getRange("A2:D300").getValues();
  SpreadsheetApp.getActive().getSheetByName('Copy').getRange("A2:D300").setValues(values);
}

这是更快的方法,但是缺少检查。有任何想法吗?

Tanaike

我相信您的目标如下。

  • 你要到单元格值从复制APICopy当值不为"#ERROR!""""#NAME!"
  • 您想使用Google Apps脚本来实现。

修改要点:

  • 当您只复制没有"#ERROR!"""的单元格值"#NAME!"以降低处理成本时,我想使用Sheets API。
    • 在这种情况下,其具有的单元值"#ERROR!"""并且"#NAME!"不会被覆盖在现有的细胞Copy
  • 当您可以允许覆盖所有单元格时,我认为您的第二个脚本可能会通过修改使用。

模式1:

在这种模式下,当您只想复制没有"#ERROR!"""的单元格值"#NAME!"以降低处理成本时,我想使用Sheets API。

示例脚本:

使用此脚本之前,请在Advanced Google services中启用Sheets API

function copy() {
  // Ref: https://stackoverflow.com/a/21231012/7108653
  const columnToLetter = column => {
    let temp,
      letter = "";
    while (column > 0) {
      temp = (column - 1) % 26;
      letter = String.fromCharCode(temp + 65) + letter;
      column = (column - temp - 1) / 26;
    }
    return letter;
  };
  
  var spreadsheet = SpreadsheetApp.getActive();
  var values = spreadsheet.getSheetByName('API').getRange("A2:D300").getValues();
  var data = values.reduce((ar, r, i) => {
      r.forEach((copyWert, j) => {
        if (!(copyWert == "#ERROR!" || copyWert == "" || copyWert == "#NAME!")) {
          ar.push({range: `'Copy'!${columnToLetter(j + 1)}${i + 2}`, values: [[copyWert]]});
        }
      });
      return ar;
  }, []);
  Sheets.Spreadsheets.Values.batchUpdate({data: data, valueInputOption: "USER_ENTERED"}, spreadsheet.getId());
}

模式2:

在这种模式下,您的第二个脚本将被修改。

示例脚本:

function copy() {
  var spreadsheet = SpreadsheetApp.getActive();
  var values = spreadsheet.getSheetByName('API').getRange("A2:D300").getValues();
  values = values.map(r => r.map(copyWert => (copyWert == "#ERROR!" || copyWert == "" || copyWert == "#NAME!") ? "" : copyWert));
  spreadsheet.getSheetByName('Copy').getRange("A2:D300").setValues(values);
}

参考文献:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章