Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

Появление диаграммы по формуле

Автор Максим Пожарский, 23.11.2023, 10:34:31

« назад - далее »

Максим Пожарский

Добрый день! Подскажите, пожалуйста, возможно появление диаграммы по формуле? Допустим есть некая таблица, на основе которой есть диаграмма. Можно ли данную диаграмму, к примеру, включать и выключать как то, допустим по флажку, если истина то диаграмма появляется, если ложь то исчезает. Я пробовал диаграмму закидывать на другой лист и тянуть её с помощью функции importrange, но не помогло, если ли другие варианты так сделать или в гугл таблицах это не предусмотрено?
Заранее благодарю за помощь! :)

Дмитрий Щербаков(The_Prist)

Насколько мне известно, скрывать диаграммы в GoogleSheets вообще нельзя. Никак.
Но можно схитрить через скрипты - перемещать диаграмму за пределы видимости:
function onEdit(e) {

 var actRng = e.range;
 if (actRng.getA1Notation() != "A1") {return;}

 var sheet = e.range.getSheet();
 var is_hide = actRng.getValue();
 resizeChart(sheet, is_hide);
}
//функция перемещения диаграммы
function resizeChart(dataSheet, hide_chart) {
 //по умолчанию нулевые размеры - чтобы скрыть
 var cw = 200, ch = 200, cx = 5, cy = 5;
 if(hide_chart)//если надо скрыть
 {
   cw = 1; ch = 1; cx = 500; cy = 500;
 }
 var charts = dataSheet.getCharts();
 var chart = charts[0]; //берется первая диаграмма - поставить нужный индекс
 chart = chart.modify().setOption('width', cw).setOption('height', ch).setPosition(cx, cy, 0, 0).build();
 dataSheet.updateChart(chart);
}

Флажок в ячейке А1.
setPosition - выставляет положение диаграммы. Поэтому cx и cy укажите свои(cx = 5 - по сути 5-ый столбец(Е), cy = 5 - пятая строка). Так же у диаграмм в гугл нет имен - поэтому обращение только по индексу. В примере это самая первая диаграмма.
С cw и ch, думаю, понятно.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Максим Пожарский

Спасибо большое! Я если честно не очень силён в скриптах :-\ Можете пожалуйста помочь?
https://docs.google.com/spreadsheets/d/1EJBVaIJtYI5XGYjJnHgGoxZb7bhu3Azlp6PoO39gvgY/edit#gid=0
У меня на листе несколько диаграмм. Я хочу сделать так, чтобы при нажатии на чекбокс появлялась строка с данными а рядом со строкой небольшая диаграмма. И так возле каждого блока. Блоков будет 4 штуки, ну и соответственно диаграмм тоже 4. Их как то можно в скрипте объединить? Чтобы при нажатии на разные чекбоксы открывалась диаграмма в соответствии со строкой? И такой еще момент, почему то цвет диаграммы скрипт меняет :-[
И диаграмма почему то появляется при снятии чекбокса а не наоборот

Максим Пожарский

И почему то скрипт куда то девает данные диаграммы :'(
скрин 930 изначальная диаграмма
скрин 907 после скрипта

Дмитрий Щербаков(The_Prist)

Нет времени сейчас заниматься подобными проектами. Вы спросили как - я дал направление. А подправлять под "решение под ключ" уже другая история и надо еще кучу нюансов уточнять у Вас. Плюс там надо еще все будет досконально прорабатывать(размеры, индексы, настройки диаграмм).
По вопросу куда-то девает данные диаграммы - надо в chart.modify() добавлять все, что надо. Можно и более сложным путем идти и применить нечто вроде запросов updateEmbeddedObjectPosition(но подозреваю, что это будет еще сложнее для понимания происходящего). К сожалению, в гугл работа с диаграммами далеко не такая удобная, как в Excel.
Ну а это:
Цитата: Максим Пожарский от 23.11.2023, 13:11:04И диаграмма почему то появляется при снятии чекбокса а не наоборот
Поменяйте это поведение на нужное Вам:
if(hide_chart)//если надо скрыть
надо просто написать
if(hide_chart == false)//если надо скрыть
или
if(!hide_chart)//если надо скрыть
это азы программирования и если с этим проблемы - то реально лучше задачу либо "заказать", либо изменять подход.
Тоже самое и с появлением при нажатии на разные чекбоксы - в скрипте же у меня указано, что чекбокс в ячейке А1 и я это дополнительно пояснил. Можно это поведение "расширить" и на другие(ветвления вроде if ... then и другие конструкции).
Но если настолько далеко от программирования - то явно не Ваш путь. Потому что даже если это Вам сделают на форуме - при любом изменении придется обращаться снова и снова.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Максим Пожарский

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

Последний вопрос, а как индекс диаграммы определить? Я же правильно понимаю, чтобы скрипт определял диаграмму нам нужно индекс указать - var chart = charts[0]; //берется первая диаграмма - поставить нужный индекс 

Дмитрий Щербаков(The_Prist)

индекс можно определить по сути только опытным путем. Иных вариантов я не припомню. Но индексы вроде как назначаются в порядке создания диаграмм - т.е. самая первая, добавленная на лист - это индекс 1, вторая - 2 и т.д. При этом, когда удаляете первую - все индексы смещаются на 1. Т.е. добавленная 2-ой становится уже 1-ой и т.д.
Из этого можно сделать простой вывод: чтобы точно знать индекс каждой диаграммы - берете каждую диаграмму по очереди и копируете в нужном порядке. Исходные потом удаляете.
Так же у каждой диаграммы есть свой уникальный ID - но для его получения надо писать отдельный код, т.к. он для внутреннего использования.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Дмитрий Щербаков(The_Prist)

Вот пример, как запоминать параметры диаграммы(на примере высоты и ширины):
function onEdit(e) {

  var actRng = e.range;
  if (actRng.getA1Notation() != "A1") {return;}

  var sheet = e.range.getSheet();
  var is_hide = actRng.getValue();
  resizeChart(sheet, !is_hide);
}
function resizeChart(dataSheet, hide_chart) {
  //по умолчанию нулевые размеры - чтобы скрыть
  var cx = 5, cy = 5;
  if(hide_chart)//если надо скрыть
  {
    cx = 500; cy = 500;
  }
  var charts = dataSheet.getCharts();
  var chart = charts[0]; //берется первая диаграмма - поставить нужный индекс
  var ch = chart.getOptions().get('height'); //запоминаем высоту
  var cw = chart.getOptions().get('width'); //запоминаем ширину
  //меняем положение диаграммы, оставляя при этом исходные размеры
  chart = chart.modify().setOption('width', cw).setOption('height', ch).setPosition(cx, cy, 0, 0).build();
  dataSheet.updateChart(chart);
}

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

Максим Пожарский

Спасибо большое! Скрипт очень классный, прямо то, что мне и нужно было, вроде работает и показывает как надо, единственно никак не могу понять как на разные чекбоксы соединить, чтобы отображались разные диаграммы
function onEdit(e) { 
 
  var actRng = e.range; 
  if (actRng.getA1Notation() != "B10") {return;} 
 
  var sheet = e.range.getSheet(); 
  var is_hide = actRng.getValue(); 
  resizeChart(sheet, is_hide); 

//функция перемещения диаграммы 
function resizeChart(dataSheet, hide_chart) { 
  //по умолчанию нулевые размеры - чтобы скрыть 
  var cw = 800, ch = 400, cx = 23, cy = 8;   
  if(hide_chart == false)//если надо скрыть 
  { 
    cw = 1; ch = 1; cx = 500; cy = 500; 
  } 
  var charts = dataSheet.getCharts(); 
  var chart = charts[0]; //берется первая диаграмма - поставить нужный индекс 
  chart = chart.modify().setOption('width', cw).setOption('height', ch).setPosition(cx, cy, 0, 0).build(); 
  dataSheet.updateChart(chart);
}
{
var actRng = e.range; 
if (actRng.getA1Notation() != "B18") {return;} 
 
  var sheet = e.range.getSheet(); 
  var is_hide = actRng.getValue(); 
  resizeChart(sheet, is_hide); 

//функция перемещения диаграммы 
function resizeChart(dataSheet, hide_chart) { 
  //по умолчанию нулевые размеры - чтобы скрыть 
  var cw = 800, ch = 400, cx = 23, cy = 8;   
  if(hide_chart == false)//если надо скрыть 
  { 
    cw = 1; ch = 1; cx = 500; cy = 500; 
  } 
  var charts = dataSheet.getCharts(); 
  var chart = charts[1]; //берется первая диаграмма - поставить нужный индекс 
  chart = chart.modify().setOption('width', cw).setOption('height', ch).setPosition(cx, cy, 0, 0).build(); 
  dataSheet.updateChart(chart);
}


Ну вы правы с навыками в програмировании не очень :-[

Максим Пожарский

Блин, никак не выходит расширить функцию function onEdit(e) :'(
Можете подсобить пожалуйста, может я не туда if добавляю...
Он почему то срабатывает только на последнею диаграмму, если с помощью if. То есть, предыдущие уже не срабатывают, если копировать через функцию if.

Дмитрий Щербаков(The_Prist)

Цитата: Максим Пожарский от 23.11.2023, 17:19:27никак не выходит расширить функцию function onEdit(e)
Если посмотреть код - то Вы и не пытаетесь расширить функцию - Вы просто за её пределы что-то написали и все :)
И кстати - доступа к файлу нет, приходится опять выдумывать свои.
Вот так будет проще доработать и понять принцип(а может и нет):
function onEdit(e) {

  var actRng = e.range;
  var sCellAddr = actRng.getA1Notation();//адрес измененной ячейки
  var ich_index = -1;//индекс диаграммы для изменения, в зависимости от измененной ячейки
  var iDefault_x = 0, iDefault_y = 0;
  if (sCellAddr == "A1")
  {
    ich_index = 0;
    //строка и столбец, где должна отображаться диаграмма
    iDefault_x = 1, iDefault_y = 2;
  }
  if (sCellAddr == "A10")
  {
    ich_index = 1;
    //строка и столбец, где должна отображаться диаграмма
    iDefault_x = 10, iDefault_y = 2;
  }
  if (ich_index == -1) {return;} //если изменена ячейка "вне списка"

  var sheet = e.range.getSheet();
  var is_hide = actRng.getValue();
  resizeChart(sheet, !is_hide, ich_index, iDefault_x, iDefault_y);
}
function resizeChart(dataSheet, hide_chart, iindx, ix, iy) {
  //по умолчанию нулевые размеры - чтобы скрыть
  var cx = ix, cy = iy;
  if(hide_chart)//если надо скрыть
  {
    cx = 500; cy = 500;
  }
  var charts = dataSheet.getCharts();
  var chart = charts[iindx]; //берется диаграмма с указанным индексом(iindx)
  var ch = chart.getOptions().get('height');
  var cw = chart.getOptions().get('width');
  chart = chart.modify().setOption('width', cw).setOption('height', ch).setPosition(cx, cy, 0, 0).build();
  dataSheet.updateChart(chart);
}

код постарался сделать максимально простым и понятным, без особо хитрых условий. Дорабатывайте.


[spoiler]P.S. надо все же как-то начать изучать программирование, раз задачи такие появляются. Ведь не первый раз со скриптами боретесь - за это время можно было бы хотя бы основами заняться :)[/spoiler]
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Максим Пожарский

https://docs.google.com/spreadsheets/d/1M81YOrKzMavN9zYmi3TtUn1wy_CdeS_pllUxvJaM6oQ/edit#gid=0

Про доступ забыл расшарить, сорри :-\

Так работает вроде хорошо, по каждому чекбоксу своя диаграмма, единственно с расширением самой диаграммы не пойму как сделать?
В вашем примере
function resizeChart(dataSheet, hide_chart, iindx, ix, iy) { 
  //по умолчанию нулевые размеры - чтобы скрыть 
  var cx = ix, cy = iy;   
  if(hide_chart)//если надо скрыть 
  { 
    cx = 500; cy = 500;


Я попробовал добавить как в предыдущем вашем примере, чтобы диаграмму немного поправить высоте и ширене:
function resizeChart(dataSheet, hide_chart, ix, iy) {   
  //по умолчанию нулевые размеры - чтобы скрыть   
  var cw = 800, ch = 400, cx = ix, cy = iy;     
  if(hide_chart == false)//если надо скрыть   
  {   
    cw = 1; ch = 1; cx = 500; cy = 500;


Но не сработало...Подскажите, пожалуйста, как еще ширину с высотой поправить ?

Дмитрий Щербаков(The_Prist)

Вот не пойму я Вас...Выше же есть пример, когда устанавливаются все нужные размеры в коде - самый первый, где я все расписал(там еще написано, что с cw и ch должно быть понятно). Вы их в тот момент, вероятно, даже не пробовали менять под нужные для диаграмм :) После чего Вам понадобилось сохранять параметры, т.к. вид диаграммы менялся(именно из-за изменения размеров, кстати, пропадали подписи). Ну можно же хотя бы смекалку-то подключать, если уж логика не дотягивает? :) Без этого в программировании точно никак.
Есть код с установкой размеров, есть без. Посмотреть, сравнить и попробовать переделать. А Вы сейчас 100% сначала пишете это:
var cw = 800, ch = 400, cx = ix, cy = iy;
а затем в коде не убираете это:
var ch = chart.getOptions().get('height'); 
var cw = chart.getOptions().get('width');

посмотрите на строки внимательно - не замечаете задвоение переменных cw и ch и назначение им значений?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Максим Пожарский

Дмитрий спасибо вам огромное за помощь и терпение :) Всё получилось вы мне очень помогли! Извините, если где местами тупил, просто с программированием не очень, так как я занимаюсь другими делами, а тут вот для отчёта и презентации понадобилась такая штука с диаграммами, спасибо еще раз что помогли осуществить планы!

Яндекс.Метрика Рейтинг@Mail.ru