Google Sheetsのスクリプトでセルに数式を追加しても、セルの値が更新されない。

2
2022.04.05

スクリプトを実行すると、数式情報のセルを追加する必要があります。セルが空の場合、スクリプトは問題なく動作しますが、数式の値を更新するために再度実行すると、値が変更されません。

function addInstructions(){
  var sheetI = SpreadsheetApp.getActive().getSheetByName('Sheet');
  
  var i,j;
  for(i=7, j=7; i<57, j<57; i=i+2, j++){
  var cell = sheetI.getRange(i,4);
  cell.setFormula("=medInstructions("+i+")");

  var cell2 = sheetI.getRange(i+1,2);
  cell2.setFormula("=medInstructions2("+j+")");
  }
}

また、クリア関数の後にスリープユーティリティを追加し、最後に実際の数式を追加する前に数式を空に設定しようとしましたが、いずれもうまくいきませんでした。

function addInstructions(){
  clearInsatructions();
  Utilities.sleep(200)
  var sheetI = SpreadsheetApp.getActive().getSheetByName('Sheet');
  
  var i,j;
  for(i=7, j=7; i<57, j<57; i=i+2, j++){
  var cell = sheetI.getRange(i,4);
  cell.setFormula("")
  cell.setFormula("=medInstructions("+i+")");

  var cell2 = sheetI.getRange(i+1,2);
  cell2.setFormula("")
  cell2.setFormula("=medInstructions2("+j+")");
  
  }
}

は、カスタム関数です。

function medInstructions(j) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var infoSheet = ss.getSheetByName("sheet"); const meds = ["var1", "var2"] const instructions =["Ins 1", "Inst 2"] var med = infoSheet.getRange(j,2).getValue().toString().toLowerCase() if(med.indexOf(meds[0].toString().toLowerCase())>-1){ var info = instructions[0] } else if(med.indexOf(meds[1].toString().toLowerCase())>-1){ var info = instructions[1] } else if(med==0){ var info = "" } else{ var info = "Other" } return info }

function medInstructions2(j) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var infoSheet = ss.getSheetByName("sheet"); const meds = ["var3", "var4"] const instructions =["Ins 3", "Inst 4"] var med = infoSheet.getRange(j,2).getValue().toString().toLowerCase() if(med.indexOf(meds[0].toString().toLowerCase())>-1){ var info = instructions[0] } else if(med.indexOf(meds[1].toString().toLowerCase())>-1){ var info = instructions[1] } else if(med==0){ var info = "" } else{ var info = "Other" } return info } 

この問題を解決するためのアイデアはありますか?ありがとうございます。

回答
1
2022.04.05

以下をお試しください。

function addInstructions(){
  clearInsatructions();
  Utilities.sleep(200)
  var sheetI = SpreadsheetApp.getActive().getSheetByName('Sheet');
  
  var i,j;
  for(i=7, j=7; j<57; i=i+2, j++){

    // Get the cells
    var cell = sheetI.getRange(i,4);
    var cell2 = sheetI.getRange(i+1,2);

    // Clear the cells
    cell.clearContent();
    cell2.clearContent();

    // Apply the cells clearing
    Spreadsheet.flush();

    // Add the custom function formulas
    cell.setFormula("=medInstructions("+i+")");
    cell2.setFormula("=medInstructions2("+j+")");
  
  }
}

また、カスタム関数の2番目のパラメータに乱数を追加する方法もあります。

cell.setFormula("=medInstructions("+i+","+Math.random()+")");