I have a script that when I run it, should add a formula info cells, if the cells are empty, the script works without any problems but if I try to run it again to update the values of the formula, the values doesn't change, here is the script:
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+")");
}
}
What I tried to do is add another script that clear the content of the cells before added the formular but for some reason that doesn't work, I also added sleep utility after the clear function and lastly I tried to set the formula to empty first before adding the actual formula but none of these had worked, here is the script with my trials
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+")");
}
}
the custom functions are:
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 }
Any ideas how to fix this?
SpreadsheetApp.flush()
as the first statement of a custom function as custom functions can't change any spreadsheet element other than the value / values that they returns.