我需要保持两个单独的电子表格同步。我一直在使用以下无法达到我目的的方法:
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);
}
所以我需要的解决方案是一个脚本,该脚本将:
有什么建议可以修改脚本,或者是否已经存在可以修改脚本的建议?
谢谢!
答案 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);
}