如何保持两个单独的电子表格同步,但仅替换更新的值?

时间:2020-09-22 17:31:24

标签: google-apps-script google-sheets

我需要保持两个单独的电子表格同步。我一直在使用以下无法达到我目的的方法:

1-一个简单的IMPORTRANGE:这行不通,因为我的数据太多,以至于由于通用错误而不断失败

2-以下功能一直运行良好,但是问题在于它首先删除了所有数据,这引起了我在目标电子表格中使用数据的方式的问题:

function exportData() {

   // source doc ID
  var sss = SpreadsheetApp.openById("SHEET_ID");
  // source sheet
  var ss = sss.getSheetByName('SHEET_NAME');
  // Get full range of data
  var SRange = ss.getDataRange();
  // get A1 notation identifying the range
  var A1Range = SRange.getA1Notation();
  // get the data values in range
  var SData = SRange.getValues();
  // target spreadsheet ID
  var tss = SpreadsheetApp.openById("SHEET_ID");
  // target sheet
  var ts = tss.getSheetByName('SHEET_NAME');
  // Clear the Google Sheet before copy
  ts.clear({contentsOnly: true});
  // set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);
  
}

所以我需要的解决方案是一个脚本,该脚本将:

  1. 查看目标表并与源表进行比较
  2. 如果目标单元格中​​的值相同,则不执行任何操作
  3. 如果目标单元格中​​的值不为空,而源单元格中的单元格为空,则不执行任何操作
  4. 如果目标单元格中​​的值与源单元格不同,并且源单元格不为空,则替换该单元格

有什么建议可以修改脚本,或者是否已经存在可以修改脚本的建议?

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要的内容可以通过将源值数组和目标值数组的数组元素相互比较来实现:

function exportData() {  
  // source doc ID
  var sss = SpreadsheetApp.openById("SHEET_ID");
  // source sheet
  var ss = sss.getSheetByName('SHEET_NAME');
  // Get full range of data
  var SRange = ss.getDataRange();
  // get A1 notation identifying the range
  var A1Range = SRange.getA1Notation();
  // get the data values in range
  var SData = SRange.getValues();
  // target spreadsheet ID
  var tss = SpreadsheetApp.openById("SHEET_ID");
  // target sheet
  var ts = tss.getSheetByName('SHEET_NAME');
  // Clear the Google Sheet before copy
  //  ts.clear({contentsOnly: true});
  // set the target range to the values of the source data
  var TRange = ts.getRange(A1Range);
  var TData =TRange.getValues();
  Logger.log(JSON.stringify(SData));
  if(JSON.stringify(TData)==JSON.stringify(SData)){
    Logger.log("Data did not change");
    return;
  }
  else{
    for(var i = 0; i < SData.length; i++){
      for(var j = 0; j < SData[0].length; j++){
        if(SData[i][j]!=0 && SData[i][j]!=TData[i][j]){
          TRange.getCell(i+1, j+1).setValue(SData[i][j])
        }
      }
    }
  }
}

但是请注意: 如果您有很多数据,这种方法将很慢。

您可能想直接替换所有导入的数据。为此,不必清除整个工作表内容-只需覆盖正在导入的部分即可:

function exportData() {
   // source doc ID
  var sss = SpreadsheetApp.openById("SHEET_ID");
  // source sheet
  var ss = sss.getSheetByName('SHEET_NAME');
  // Get full range of data
  var SRange = ss.getDataRange();
  // get A1 notation identifying the range
  var A1Range = SRange.getA1Notation();
  // get the data values in range
  var SData = SRange.getValues();
  // target spreadsheet ID
  var tss = SpreadsheetApp.openById("SHEET_ID");
  // target sheet
  var ts = tss.getSheetByName('SHEET_NAME');
  // Do NOT clear the Google Sheet before copy

  // set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData); 
}