试图找到Google Spreadsheet Script缓存的解决方法

时间:2014-01-20 05:34:52

标签: google-apps-script google-sheets google-spreadsheet-api

我一直在调查已发布的其他问题,但无法理解如何将解决方案应用于我的情况。希望这里的答案能让其他人更加明白。

我在Code.gs中有一个函数,它将数据行(符合特定条件)复制到另一个电子表格中。

function CopyRowsToAUDistDataSheet() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var target = SpreadsheetApp.openById("######");
  var lastRow = source.getLastRow();
  var source_sheet = source.getSheetByName("Raw Data");
  var target_sheet = target.getSheetByName("Distributors");

  var source_range = source_sheet.getDataRange();
  var target_range = target_sheet.getDataRange();

  var i = 2;
  while (i <= lastRow) {
  if (source_sheet.getRange("C"+i).getValue() == "Distributor" ) {
    var A = source_sheet.getRange("A"+i).getValue();
    var B = source_sheet.getRange("B"+i).getValue();
    var C = source_sheet.getRange("C"+i).getValue();
    var D = source_sheet.getRange("D"+i).getValue();
    var E = source_sheet.getRange("E"+i).getValue();
    var F = source_sheet.getRange("F"+i).getValue();
    var G = source_sheet.getRange("G"+i).getValue();
    var H = source_sheet.getRange("H"+i).getValue();
    var I = source_sheet.getRange("I"+i).getValue();
    var J = source_sheet.getRange("J"+i).getValue();
    var K = source_sheet.getRange("K"+i).getValue();
    var L = source_sheet.getRange("L"+i).getValue();
    var M = source_sheet.getRange("M"+i).getValue();
    var N = source_sheet.getRange("N"+i).getValue();
    N *= 100;
    var data = [A,B,C,D,E,F,G,H,I,J,K,L,M,N];
    target_sheet.appendRow(data);
    i++;
  } else {
    i++;
  }
}
}

每次复制数据时,单元格中的更新值,或者对上述函数中的数据进行的更新都不会被识别(注意添加“N * = 100”以将值乘以100到解决百分比问题。)

我无法通过上述功能找出如何绕过此缓存问题。我试过传递时间戳等但没有运气。我相信我错过了一些明显的东西。

非常感谢任何帮助。

我尝试过使用此处发布的解决方案/答案:

Refresh data retrieved by a custom function in google spreadsheet

Script to summarise data not updating

更新

该功能现在更新为以下内容:

function CopyRowsTest() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var target = SpreadsheetApp.openById("###");
  var source_sheet = source.getSheetByName("Raw Data");
  var target_sheet = target.getSheetByName("Distributors");
  var source_range = source_sheet.getDataRange();
  var source_data = source_range.getValues();

  for (var i = 1, r = source_data.length; i < r; i++) {
    if (source_data[i][2] === 'Distributor') {
      // Multiply % data by 100 to work around bug
      source_data[i][13] *= 100;
      source_data[i][16] *= 100;
      source_data[i][23] *= 100;
      source_data[i][29] *= 100;
      source_data[i][31] *= 100;

      target_sheet.appendRow(source_data[i]);
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我已经测试了您的脚本,以及新旧Google Spreadsheets中功能相同的脚本。我可以在 Source 表中更改单元格的值,通过菜单运行脚本,然后验证目标表中是否存在相同的数据。

列出的所有缓存问题都涉及在电子表格的单元格中运行的自定义函数。您的脚本仅在主动编写脚本时通过菜单或IDE运行,并且不符合列出的重新计算问题的标准。

您可以在FILTER上使用IMPORTRANGE,但这似乎不是'直播':

=FILTER(IMPORTRANGE("key", "Raw Data!A2:E100"),  ImportRange("key", "Raw Data!C2:C100") = "Distributor")

以下脚本适用于旧版Google电子表格,可通过IDE或菜单可靠地运行。如果它不适用于两个新表中的小数据集,请告诉我。

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [
    {name: "Copy Distributor Rows", functionName: "CopyRowsTest"}
  ];
  ss.addMenu("Copy Rows", menuEntries);
}

function CopyRowsTest() { 
  var source_ss = SpreadsheetApp.getActiveSpreadsheet();
  var target_ss = SpreadsheetApp.openById("xxx");

  var target_sheet = target_ss.getSheetByName("Distributors");
  var source_range = source_ss.getSheetByName("Raw Data").getDataRange();

  var source_values = source_range.getValues();
  var source_formats = source_range.getNumberFormats();

  // Filter the Values
  var filtered_values = source_values.filter(function (row) {

    // Filter your data here
    return row[2] === 'Distributor'; // Column C

  });

  // Append the filtered Values to the target sheet
  filtered_values.forEach(function (row, r) {

    // This will fix any % formatted columns caused by issue 1265
    row = fixPercentFormattedColumns(row, source_formats[r]);

    // Write data to Sheet
    target_sheet.appendRow(row);
  });
}

function fixPercentFormattedColumns(row, rowFormat) {
  return row.map(function (cell, colNum) {
    // Check that the format ends with %, if so return value * 100
    return /%$/.test(rowFormat[colNum]) ? cell * 100 : cell;
  });
}