Мне нужно обновить много диаграмм Google, и я хочу распараллелить обработку цикла for.
Я видел код по этой ссылке: Потоки в Google App Script но это слишком сложно для меня. Мне не нужно распараллеливать код и возвращать данные.
for(i=0;i<nbChart;i++)
{
Vmax=rangeMax[i*6];
Vmin=rangeMinId[i*6];
id=rangeMinId[(i*6)+1];
var delta=(Vmax-Vmin)*0.1;
Logger.log("Vmax = "+Vmax+"Vmin = "+Vmin+"id = "+id+"i = "+i);
var chart = sheet.getCharts()[id];
if (chart.getType()! = "COLUMN")
{
Vmin-=delta
Vmax=Number(Vmax)+(delta*1.5)//Number() function to avoid Vmax becoming a string for no reason
}
Logger.log("Vmax = "+Vmax+"Vmin = "+Vmin+"id = "+id+"i = "+i);
chart = chart.modify()
.setOption('vAxes', {0: {textStyle: {fontSize: 10}, titleTextStyle: {fontSize : 8}, viewWindow: {min: Vmin, max:Vmax}}})//adpative vaxis for AREA and COMBO
.build();
sheet.updateChart(chart);
}
Мне просто нужно быстро обновить свои диаграммы, потому что в настоящее время обновление одного листа занимает около 15 минут.





В настоящее время вы вызываете sheet.getCharts() каждый раз, когда запускается цикл, что резко увеличивает время выполнения. Если поместить вызов функции вне цикла, а затем обратиться к диаграмме только по ее идентификатору внутри, это уменьшит количество вызовов функции в цикле:
var chart = sheet.getCharts();
for(i = 0; i < nbChart; i++) {
Vmax = rangeMax[i * 6];
Vmin = rangeMinId[i * 6];
id = rangeMinId[(i * 6) + 1];
var delta=(Vmax - Vmin) * 0.1;
var currChart = chart[id];
if (currChart.getType() != "COLUMN") {
Vmin -= delta
Vmax = Number(Vmax) + (delta * 1.5) //Number() function to avoid Vmax becoming a string for no reason
}
currChart = currChart.modify()
.setOption('vAxes', {0: {textStyle: {fontSize: 10}, titleTextStyle: {fontSize : 8}, viewWindow: {min: Vmin, max:Vmax}}}) //adpative vaxis for AREA and COMBO
.build();
sheet.updateChart(currChart);
}
В качестве другого решения, если порядок обновления диаграмм не важен, вы можете написать второй скрипт с той же структурой цикла, но с другим условием цикла.
Если вы запускаете два цикла в двух разных сценариях, один из которых работает for (i = 0; i < nbChart; i = i + 2), а второй — for (i = 1; i < nbChart; i = i + 2), вы можете настроить два устанавливаемых триггера для их одновременного запуска или для одного и того же действия, что также сократит общее время выполнения.
Я последовал вашему совету и попытался создать функцию, которая создает 2 экземпляра моей функции, но функция, похоже, вообще не работает. Создать другой пост или отредактировать этот?
@ LALLEMENT.E Было бы лучше, если бы вы задали новый вопрос, посвященный этой проблеме.
Я разместил полное решение по этой ссылке: stackoverflow.com/questions/57053706/…
Большое спасибо, я попробую это. Я также собирался сделать ваше второе решение, чтобы сократить время!