ImportRange:错误:无法找到导入范围的范围或工作表

时间:2017-12-15 09:36:44

标签: google-apps-script google-sheets

Google电子表格。 我动态删除旧工作表并创建(我使用 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());
 }
}

我试图&#34;欺骗&#34;电子表格:

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);

它仍然无法运作! enter image description here

1 个答案:

答案 0 :(得分: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仅获取值,因此它没有任何区别。