0

谷歌电子表格。我动态删除旧工作表并创建(我使用sheet.copyTo()函数)具有相同名称的新工作表,但 IMPORTRANGE 公式无法(定期)找到新工作表。

=ImportRange("ssId", "Data!A1:B1")

此脚本工作正常,但其他通过 IMPORTRANGE 公式定期从此电子表格中获取数据的电子表格无法找到新的(生成的)表格:

=QUERY(IFERROR(IMPORTRANGE("ssId", "Data!A:AU")),"SELECT * ", 0)

这个公式不返回任何东西!

function copySpreadSheet(sourceId, targetId) {
try {
var sourceSS = SpreadsheetApp.openById(sourceId);
SpreadsheetApp.setActiveSpreadsheet(sourceSS);
var sourceSheets = sourceSS.getSheets();

var targetSS = SpreadsheetApp.openById(targetId);
SpreadsheetApp.setActiveSpreadsheet(targetSS);
var targetSheets = targetSS.getSheets();

//you can't delete all sheets!
var timestamp = new Date().getTime();
var tempName = "TEMPORARY-FOR-DELETE-" + timestamp;
targetSS.insertSheet(tempName);    

for(var i = 0; i < targetSheets.length; i++) {
  targetSS.deleteSheet(targetSheets[i]);
}

var sourceCharts = [];
var newSheetCharts = [];
var newSheet = null;
var newSheetName = "";
for(var i = 0; i < sourceSheets.length; i++) {
  newSheet = sourceSheets[i].copyTo(targetSS)
  newSheetName = newSheet.getName().replace("Copy of ", "");
  newSheet.setName(newSheetName);

  /*
  newSheetCharts = newSheet.getCharts();

  sourceCharts = sourceSheets[i].getCharts();
  for(var j = 0; j < sourceCharts.length; j++) {

   /* Server Error:
   var chart = newSheetCharts[j].modify()
    .setChartType(sourceCharts[j].getType())
    .addRange(sourceCharts[j].getRange())
    .build();
   newSheet.updateChart(chart);
   */

    //insertImage(blob, column, row, offsetX, offsetY)

    /*
    newSheet.insertImage(
      sourceCharts[j].getBlob(),
      sourceCharts[j].getContainerInfo().getAnchorColumn(),
      sourceCharts[j].getContainerInfo().getAnchorRow(),
      sourceCharts[j].getContainerInfo().getOffsetX(),
      sourceCharts[j].getContainerInfo().getOffsetY()
    );
    */
 /* } */

}

targetSS.deleteSheet(targetSS.getSheetByName(tempName)); //remove a temporary sheet  

//Adding Date Stamp:
targetSS.insertSheet("Last time updated").hideSheet().getRange(1, 1).setValue(new Date());

SpreadsheetApp.flush();
Utilities.sleep(500); 

return targetSS;

} catch (err) {
  Logger.log(err.toString());
 }
}

我试图“欺骗”电子表格:

var querySheet = dataSourceSS.getSheetByName("Query");
querySheet.activate();
Logger.log(formula);
querySheet.getRange(2, 1).setFormula("=Minute(Now())"); //any FORMULA 
Utilities.sleep(1000);
querySheet.getRange(2, 1).setFormula(formula);

它仍然不起作用! 在此处输入图像描述

4

1 回答 1

1

创建具有相同名称的新工作表并不能保证在任何情况下都会将其视为旧工作表的替代品。工作表具有 ID 号,用于独立于名称来识别它们。如果importrange已链接到特定工作表,并且该工作表被删除,则无法保证它会自动重新链接到具有相同名称的另一个工作表。可能的解决方案:

  • 删除并重新输入importrange公式;如果它可以访问这些电子表格,也可以使用脚本来完成
  • (首选):不删除和重新创建工作表。清除现有工作表并将新值复制到其中。

例子:

targetSheets[i].clear()
var values = sourceSheets[i].getDataRange().getValues();
targetSheets[i].getRange(1, 1, values.length, values[0].length).setValues(values);

这不会复制格式或公式;效果基本上与仅复制和粘贴值相同。但importrange只获取值,所以它没有区别。

于 2017-12-15T17:53:50.987 回答