Можно ли изменить ссылку на ячейку внутри формулы, основанной на activeRange? - PullRequest
0 голосов
/ 28 марта 2019

Я хочу изменить номер ячейки внутри формулы в зависимости от того, где он находится.

Пользователь листа с моим скриптом может щелкнуть пункт меню, чтобы добавить макет, который содержит набор формул. Но когда я запускаю свой скрипт, ячейки, в которых находится моя формула, не изменяют ссылку на ячейку в зависимости от того, где пользователь добавил макет.

Я также ищу способ предустановки макета с 5 строками, 10 строками и 15 строками, которые будут иметь формулы расчета.

Таким образом, когда пользователь активирует ячейку A1 и входит в меню, он / она может выбрать, хотят ли они 5, 10, 15 строк для добавления элементов.

Это будет сценарий на листе для расчета стоимости продуктов не только того, сколько стоит приготовить рецепт, но и того, сколько нужно оценить, чтобы не потерять деньги.

Я не нашел ни одного ответа ни в Интернете, ни через Youtube, чтобы указать мне правильное направление. Я искал ответы на вопрос https://developers.google.com/apps-script/reference/script/ и до сих пор не могу понять, как сделать так, как я хочу.

\\\ function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Kalkyle')
      .addItem('Sett inn layout', 'layout')
      .addSeparator()
      .addItem('Ny Kalkyle', 'nyKalkyle')
      .addToUi();
}    

function nyKalkyle() {

 var sheet = SpreadsheetApp.getActiveRange();
 var numFormat = sheet.setNumberFormat("0.00 KR");
 var range = "Navn:";
 var range1 = "Salgspris:";
 var range2 = "Varenummer";
 var range3 = "Varenavn";
 var range4 = "Pris pr kg";
 var range5 = "Pris pr gr";
 var range6 = "Svinn %";
 var range7 = "Vår mengde"; 
 var range8 = "Råvarekostnad";
 var range9 = "Varekost";
 var range10 = "";

 // OppskriftNavn
 sheet.setValue(range); 

 // SalgsPris
 sheet.offset(0, 3).setValue(range1); 

  // Råvarekostnad
  sheet.offset(1, 3).setValue(range8); 

  // Formel Råvarekostand
  sheet.offset(1, 4).setFormula('=sum(G9:G15)').setNumberFormat("#,## kr"); 

Диапазон (G9: G15) должен изменяться в зависимости от того, куда передается макет. Он передается пользователем в активной ячейке, когда он / она нажимает «Ny kalkyle

  // Varekost
  sheet.offset(0, 5).setValue(range9);

  // Formel Varekost
  sheet.offset(0, 6).setFormula('=E4/E3'); 

  // Varenummer
  sheet.offset(4, 0).setValue(range2).setBackground("lightgray"); 

  // Formel Finn varenummer
  sheet.offset(6, 0).setFormula('=ArrayFormula(IFERROR(UNIQUE(Query(IMPORTRANGE("https://docs.google.com/spreadsheets/d/1PagM-gaCoKXV012t-AzaTsk5o3GUd0YGXeXOSECSWVo/edit#gid=0";"A2:C");"Select Col1 where Col2=\'"&B9&"\'"))))');

Диапазон («B9») должен меняться в зависимости от того, куда передается макет. Он передается пользователем в активной ячейке, когда он / она нажимает «Ny kalkyle»

  // Varenavn
  sheet.offset(4, 1).setValue(range3).setBackground("lightgray"); 

  // Pris pr kg
 sheet.offset(4, 2).setValue(range4).setBackground("lightgray");

Диапазон («B9») должен меняться в зависимости от того, где передан макет. Он передается пользователем в активной ячейке, когда он / она нажимает «Ny kalkyle»

  // Formel Finn KG pris  
  sheet.offset(6, 2).setFormula('=ArrayFormula(IFERROR(UNIQUE(Query(IMPORTRANGE("https://docs.google.com/spreadsheets/d/1PagM-gaCoKXV012t-AzaTsk5o3GUd0YGXeXOSECSWVo/edit#gid=0";"A2:E");"Select Col3 where Col2=\'"&B9&"\'"))))').setNumberFormat("#,## kr");

  // Pris pr gr
  sheet.offset(4, 3).setValue(range5).setBackground("lightgray"); 

  // Formel Pris pr gr
  sheet.offset(6, 3).setFormula('=C9/1000'); 

 // Svinn %
 sheet.offset(4, 4).setValue(range6).setBackground("lightgray");  

 // Formel svinn
 sheet.offset(6, 4).setNumberFormat("#,###%");

 // Vår mengde
 sheet.offset(4, 5).setValue(range7).setBackground("lightgray");  

 // Råvarekostnad
 sheet.offset(4, 6).setValue(range8).setBackground("lightgray"); 

Диапазон внутри setFormula должен меняться в зависимости от того, где передан макет. Он передается пользователем в активной ячейке, когда он / она нажимает «Ny kalkyle»

  // Formel Råvarekostnad
 sheet.offset(6, 6).setFormula('=ArrayFormula(IF(C9;D9*F9+(E9/1*D9*F9);""))').numFormat;

}

Я хочу, чтобы ссылки на каждую ячейку менялись, когда пользователь решил добавить их в макет.

Если у него / нее активирована ячейка A1, ссылка на ячейку должна указывать правильные ячейки внутри формул.

То же самое, если у него / нее активирована ячейка A25.

Но в зависимости от моего сценария он не изменяется, и это делает его таким, чтобы вычисление не складывалось правильно, а затем пользователь должен изменить ячейку ref каждый раз, когда передается макет, и это делает мой сценарий таким бессмысленно.

EDIT

После помощи вас в этом сообществе и большого количества поисков в Google я получил результат, который работает так, как я видел для себя. Теперь осталось найти способ добавить выпадающий список с диапазоном так же, как проверка данных

Вот сценарий, с которым я закончил https://pastebin.com/TBw86PtK

1 Ответ

0 голосов
/ 29 марта 2019

Вы можете использовать getActiveRange, чтобы получить активную ячейку и обновить все ваши формулы с подстановкой строк, но это плохое решение, которым будет сложно управлять.

var sheet = SpreadsheetApp.getActiveRange();
var active_row = sheet.getRow();
var active_column = sheet.getColumn();
/* 
  various math here to calculate correct row/column values,
  and convert them into A1 notation inside strings

  NOT RECOMMENDED!
*/

Вам гораздо лучше использовать относительную форму записи R1C1, которая использует квадратные скобки.Например: R [1] C [1].Когда вы используете квадратную скобку вокруг чисел в R1C1, это указывает количество строк или столбцов относительно относительно текущей ячейки.Если вы укажете R [1] C [1] в ячейке A1, вы будете ссылаться на ячейку B2 (строка + 1, столбец + 1) или на одну строку ниже и один столбец справа от активной ячейки.Точно так же вы можете использовать 0 или отрицательные числа в квадратных скобках.0 относится к текущей строке или столбцу, а отрицание будет сдвигаться «вверх» и «влево» для строк и столбцов.

  • R [0] C [2] в ячейке A1 приведет к значению вячейка С1.(строка + 0, столбец +2)
  • R [-2] C [-1] в ячейке B3 приведет к значению в ячейке A1.(строка -2, столбец -1)

Таким образом, используя относительную нотацию R1C1, вы можете гарантировать, что все ваши формулы будут ссылаться на ячейки относительно того места, где они вставлены в лист.

После обновления формул до нотации R1C1 вам нужно будет использовать функцию SetFormulaR1C1 вместо SetFormula

Итак, если предположить, что формулы, которые вы написали в существующем коде, относятся к A1, это будет выглядеть как-токак это:

sheet.offset(1, 4).setFormulaR1C1('=sum(R[8]C[3]:R[14]C[3])').setNumberFormat("#,## kr"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...