Как написать эту формулу на языке Google Apps Script?

Как переписать данную формулу с использованием функции *SUM*, чтобы суммирование выполнялось более наглядно и эффективно?
  • 18 февраля 2024 г. 9:38
Ответы на вопрос 2
Для написания данной формулы на языке Google Apps Script можно использовать следующий код:

```javascript
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName("Sheet1");

var rangeA = sheet.getRange("A1:A10");
var rangeB = sheet.getRange("B1:B10");

var sum = 0;
for (var i = 0; i < rangeA.getValues().length; i++) {
  sum += (rangeA.getValues()[i][0] * rangeB.getValues()[i][0]);
}

sheet.getRange("C1").setValue(sum);
```

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

```javascript
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName("Sheet1");

var rangeA = sheet.getRange("A1:A10");
var rangeB = sheet.getRange("B1:B10");

var sum = "=SUM(A1:A10*B1:B10)";

sheet.getRange("C1").setFormula(sum);
```
Положим, что вам нужно заменить работу функции, т.е. вернуть тоже самое значение, но только "вписать" данные скриптом 

function calcData() {
  const book = SpreadsheetApp.getActive();

  const spravochnik = book.getRange("'Как заменить формулу скриптом'!M2:N5")
    .getValues().reduce((a, r) => {
      if (r[0] && r[1]) {
        a[r[0]] = r[1];
      }
      return a;
    }, {});

  const headersX = book.getRange("'Как заменить формулу скриптом'!D2:G2").getValues()[0]
    .map(h => spravochnik[h] || 0);

  const voprosData = book.getRange("Как заменить формулу скриптом!D3:G8")
    .getValues();

  const voprosData2 = book.getRange("Как заменить формулу скриптом!H3:I8")
    .getValues();

  const values = voprosData.map((row, j) => {
    return [row.reduce((a, v, i) => a + headersX[i] * v, 0)
      + +voprosData2[j].reduce((a, v) => a + v, 0)];
  });

  book.getSheetByName("Как заменить формулу скриптом")
    .getRange(3, 10, values.length, values[0].length).setValues(values)
    .activate();
}


Теперь можно назначить calcData как вызов для триггера события Edit . Если добавляете в событие, то нужно еще будет проверить имя активного листа и изменяемый диапазон.

Похожие вопросы