【问题标题】:Google Sheets Script - Too slowGoogle 表格脚本 - 太慢了
【发布时间】:2019-12-09 13:26:54
【问题描述】:

我将谷歌表设置为我的树莓派的数据库,以发送温度、湿度等读数。这样做很好,但是由于某种原因,谷歌表会在同一张表中创建重复的巨大数据数组。

为了解决这个问题,我一直在使用我找到的标准 removeDuplicates google 脚本代码(见下文)。这样做的问题是,有时谷歌表格会复制超过 100,000 行数据以复制几次。这意味着脚本有很多重复项需要整理。

我已经读到,问题可能出在太多重复项上,必须单独编写以对每个重复项进行排序可能会花费太长时间,我应该尝试一次性获取所有重复项的列表,然后执行所有一次性删除重复项。现在我对此比较陌生,所以我不确定如何实现这一点。

function removeDuplicates() {
    // [START apps_script_sheets_sheet]
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spreadsheet.getSheetByName('RawData');
    var data = sheet.getDataRange().getValues();
    // [END apps_script_sheets_sheet]
    // [START apps_script_sheets_new_data]
    var newData = [];
    // [END apps_script_sheets_new_data]
    for (var i in data) {
      var row = data[i];
      var duplicate = false;
      for (var j in newData) {
        if (row.join() == newData[j].join()) {
          duplicate = true;
        }
      }
      // [START apps_script_sheets_duplicate]
      if (!duplicate) {
        newData.push(row);
      }
      // [END apps_script_sheets_duplicate]
    }
    // [START apps_script_sheets_clear]
    sheet.clearContents();
    sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
    // [END apps_script_sheets_clear]
  }
  // [END apps_script_sheets_remove_duplicates]

唯一的错误是代码没有在分配的 6 分钟内完成。

我该如何解决这个问题?

【问题讨论】:

  • 这看起来像是XY Problem——理想情况下,我们可以避免在第一时间创建重复项,而不是在事后尝试删除十万行。我建议为创建重复条目的脚本发布一个单独的问题,并首先尝试防止这种行为。

标签: javascript performance google-sheets duplicates


【解决方案1】:

尝试指定行数,可能是它试图包括剩余的空行。

function removeDuplicates() {
    // [START apps_script_sheets_sheet]
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spreadsheet.getSheetByName('RawData');
    var startRow = 1;  // First row of data to process
    var numRows = 4000;
    var data = sheet.getRange(startRow, 1, numRows, 1000)

    // [END apps_script_sheets_sheet]
    // [START apps_script_sheets_new_data]
    var newData = [];
    // [END apps_script_sheets_new_data]
    for (var i in data) {
      var row = data[i];
      var duplicate = false;
      for (var j in newData) {
        if (row.join() == newData[j].join()) {
          duplicate = true;
        }
      }
      // [START apps_script_sheets_duplicate]
      if (!duplicate) {
        newData.push(row);
      }
      // [END apps_script_sheets_duplicate]
    }
    // [START apps_script_sheets_clear]
    sheet.clearContents();
    sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
    // [END apps_script_sheets_clear]
  }
  // [END apps_script_sheets_remove_duplicates]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多