Скрипт Google Apps: setFormulas и rangeList - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь setFormulas по целому ряду несмежных клеток.Мне нужна формула (они все разные), устанавливаемые каждые 30 клеток в одном столбце (с).

Работает до setFormula для каждой ячейки, но создание 56 переменных кажется ненужным.Я могу получить формулы, но не установить их, как задумано.Я также пытался использовать getRangeList, но я не уверен, что это делает то, что я думаю, что делает.Любой совет?

function test() {
  var spreadsheetU09U10 = SpreadsheetApp.openById('some url');
  var sheetU09 = spreadsheetU09U10.getSheetByName('TEST');
  var sheetU10 = spreadsheetU09U10.getSheetByName('U10');
  var sheetDATA = spreadsheetU09U10.getSheetByName('Sheet4');

  //U09 SHEET
  //var rangeListU09 = sheetU09.getRangeList(['C4','C34','C64','C94','C124','C154','C184','C204','C234','C264','C294','C324','C354','C384','C404','C434','C464','C494',
  //'C524','C554','C584','C604','C634','C664','C694','C724','C754','C784']);
  //Logger.log(rangeListU09);
  var startRow = 4;
  var startColumn = 3;
  var numRows = sheetU09.getLastRow();
  var numColumns = 1;
  var range = sheetU09.getRange(startRow, startColumn, numRows, numColumns);

  var getFormulasU09 = sheetDATA.getRange('C30:C57').getFormulas();
  //Logger.log(getFormulasU09);
  Logger.log(getFormulasU09.length);

  for (var i = 0; i < getFormulasU09.length; i++) {
    var setFormulasU09 = range.setFormulas(getFormulasU09);
    Logger.log(setFormulasU09);
    startRow = startRow + 29; 
  }

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Не совсем ясно, откуда берутся формулы, которые вы используете, но класс RangeList может помочь сократить время чтения , даже если вы используете его просто для вызова getRanges.Если формула одинакова в формате R1C1, то вы можете очень эффективно использовать RangeList#setFormulaR1C1.

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

const wb = SpreadsheetApp.getActive();
// Assuming only text formulas, not actual "entered" formulas
const formulas = wb.getSheetByName("formulas").getDataRange()
    .getValues()
    .map(function (row) { return row[0]; });

const sheet = wb.getSheetByName("some name");
const destinations = [
  // Depending on the relationship between destinations, one could programmatically generate these
];
// Efficiently acquire references to multiple disjoint Ranges
const rl = sheet.getRangeList(destinations);
// Assume the i-th formula goes in the i-th range
rl.getRanges().forEach(function (rg, i) {
  rg.setFormula(formulas[i]);
});
// The RangeList makes uniformly formatting these disjoint ranges extremely simple
rl.setFontWeight('bold');
...

Ссылка - RangeList

0 голосов
/ 25 декабря 2018

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

function test109() {
  var ss=SpreadsheetApp.getActive();
  var shU09=ss.getSheetByName('35');//formulas get copied into here starting at row 4
  var shDATA=ss.getSheetByName('36');//formulas stored in here C30:C57
  var fA=shDATA.getRange('C30:C57').getFormulas();
  var dA=['C4','C34','C64','C94','C124','C154','C184','C204','C234','C264','C294','C324','C354','C384','C404','C434','C464','C494','C524','C554','C584','C604','C634','C664','C694','C724','C754','C784'];  
  for(var i=0;i<dA.length;i++){
    var rgs=Utilities.formatString('%s:%s',dA[i],shU09.getRange(dA[i]).offset(fA.length-1,0).getA1Notation());//this uses range.offset to calculate the correct range in A1Notation.
    shU09.getRange(rgs).setFormulas(fA);
  }
}

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

function test109() {
  var ss=SpreadsheetApp.getActive();
  var shU09=ss.getSheetByName('35');//formulas get copied into here starting at row 4
  var shDATA=ss.getSheetByName('36');//formulas stored in here C30:C57
  var fA=shDATA.getRange('C30:C57').getFormulas();
  var dA=['C4','C34','C64','C94','C124','C154','C184','C204','C234','C264','C294','C324','C354','C384','C404','C434','C464','C494','C524','C554','C584','C604','C634','C664','C694','C724','C754','C784'];
  for(var i=0;i<dA.length;i++){
    shU09.getRange(dA[i]).setFormula(fA[i][0]);
  }
}
0 голосов
/ 25 декабря 2018
  • Вы хотите поместить формулы в отдельные ячейки.
    • Вы хотите поместить 28 формул в ячейки ['C4','C34','C64','C94','C124','C154','C184','C204','C234','C264','C294','C324','C354','C384','C404','C434','C464','C494', 'C524','C554','C584','C604','C634','C664','C694','C724','C754','C784'] на листе TEST.

Если мое понимание верно, как насчет использованияvalues.batchUpdate Sheets API?Этот сценарий выполняется следующим образом.

  1. Установить список диапазонов как одномерный массив.
  2. Извлечь формулы.
  3. Создать тело запроса для sheet.spreadsheets.values.batchUpdate.

Чтобы использовать этот сценарий, включите Sheets API в Advanced Google Services и консоли API.О том, как включить API Sheets, можно узнать по здесь .

Пример сценария:

function test() {
  var spreadsheetId = "### spreadsheetId ###"; // Please set this.

  var sheetName = "TEST";
  var spreadsheetU09U10 = SpreadsheetApp.openById(spreadsheetId);
  var sheetU09 = spreadsheetU09U10.getSheetByName(sheetName);
//  var sheetU10 = spreadsheetU09U10.getSheetByName('U10'); // This is not used in this script.
  var sheetDATA = spreadsheetU09U10.getSheetByName('Sheet4');

  var rangeListU09 = ['C4','C34','C64','C94','C124','C154','C184','C204','C234','C264','C294','C324','C354','C384','C404','C434','C464','C494', 'C524','C554','C584','C604','C634','C664','C694','C724','C754','C784'];
  var getFormulasU09 = sheetDATA.getRange('C30:C57').getFormulas();

  rangeListU09 = rangeListU09.map(function(e) {return sheetName + "!" + e});
  var resource = {
    data: rangeListU09.map(function(e, i) {return {range: e, values: [[getFormulasU09[i][0]]]}}),
    valueInputOption: "USER_ENTERED",
  };
  Sheets.Spreadsheets.Values.batchUpdate(resource, spreadsheetId);
}

Примечание:

  • Из вашего вопросаЯ не уверен насчет подробных формул.Если необходимо изменить a1Notation каждой формулы, можете ли вы предоставить образец электронной таблицы, включающей формулы?

Ссылка:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...