Google Sheets appendRow со значениями формулы - PullRequest
1 голос
/ 11 марта 2019

Моя цель - написать в Google Sheets скрипт, который будет копировать два (или более) значения из определенных ячеек в одной строке на листе в нижнюю часть списка на другой.Мне нужно скопировать фактические значения, а также вычислить дополнительные из исходных значений.

Это моя первая попытка, и я должен объяснить, что я пытаюсь сделать:

   function CopyCals() {
   var spreadsheet = SpreadsheetApp.getActive();
   spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet2'), true);
  spreadsheet.appendRow(['=today()','','=Sheet1!B30','=Sheet1!E30','=Sheet1!B30-Sheet1!E30','=Sheet1!B30-(Sheet1!E30-2500)']);
      };

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

Чтобы обойти это, я попытался использовать getRange, но не могу понять, как выбрать конкретные элементы (например, значения C30 и E30) вмассив.Ниже я попробовал:

function copyCals2() {
  var spreadsheet = SpreadsheetApp.getActive();
  var range = spreadsheet.getRange("B30:E30").getValues();
  spreadsheet.appendRow(range[0]);
  };

Как получить appendRow, чтобы печатать только значения для C30 и E30 и использовать их в формулах, как показано в моей первоначальной попытке.

1 Ответ

1 голос
/ 11 марта 2019

Получение нужных данных

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
};

Это, вероятно, легче написать:

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  var b30=sh1.getRange('B30').getValue();
  var e30=sh1.getRange('E30').getValue();
  sh2.appendRow([new Date(),'',b30,e30,b30-e30,b30-(E30-2500)]);
  //sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
}

Я бы предпочел сделать это примерно так:

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  var vA=sh1.getRange('B30:B31').getValues();
  var b30=vA[0][0];
  var b31=vA[1][0];
  //var b30=sh1.getRange('B30').getValue();
  //var e30=sh1.getRange('E30').getValue();
  sh2.appendRow([new Date(),'',b30,e30,b30-e30,b30-(E30-2500)]);
  //sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
}

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

В последнем подходе полезно использовать отладчик, чтобы получить представление о том, как выглядят данные:

vA=[[value in B30],[value in B31]] so the vA[0][0] is B30 and vA[1][0] is B31

А вот еще один способ написать функцию getRange ():

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  var vA=sh1.getRange(30,2,2,1).getValues();
  //var vA=sh1.getRange('B30:B31').getValues();
  var b30=vA[0][0];
  var b31=vA[1][0];
  //var b30=sh1.getRange('B30').getValue();
  //var e30=sh1.getRange('E30').getValue();
  sh2.appendRow([new Date(),'',b30,e30,b30-e30,b30-(E30-2500)]);
  //sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
}

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

function CopyCals() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Sheet1');
  var sh2=ss.getSheetByName('Sheet2');
  var vA=sh1.getDataRange().getValues();
  var b30=vA[29][1];
  var b31=vA[30][1];
  //var vA=sh1.getRange('B30:B31').getValues();//gets all the data at one time
  //var b30=vA[0][0];
  //var b31=vA[1][0];
  //var b30=sh1.getRange('B30').getValue();
  //var e30=sh1.getRange('E30').getValue();
  sh2.appendRow([new Date(),'',b30,e30,b30-e30,b30-(E30-2500)]);
  //sh2.appendRow([new Date(),'',sh1.getRange('B30').getValue(),sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-sh1.getRange('E30').getValue(),sh1.getRange('B30').getValue()-(sh1.getRange('E30').getValue()-2500)]);
}

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

...