2017-12-15 53 views
0

Googleスプレッドシート。 古いシートを動的に削除して、同じ名前の新しいシートを作成します(sheet.copyTo()関数)が、IMPORTRANGE式で新しいシートを(定期的に)見つけることができません。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); 

それはまだ動作しません! enter image description here

答えて

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は値だけを取得するので、違いはありません。

関連する問題