function onEdit(event) {
  //Возникает при изменении ячейки
  var ss = event.source.getActiveSheet();//Текущий лист
  var address = event.range.getA1Notation().toUpperCase();//Адрес ячейки
  var row = event.range.getRow();      //Номер строки
  var col = event.range.getColumn();  //Номер столбца
  var newValue = event.value;            //Новое значение
  var oldValue = event.oldValue;        //Старое значение
  
  if (["Лист1","Лист2"].indexOf(ss.getName())==-1) return;	//Указываем на каких листах должен работать скрипт
  //Можно при желании ещё фильтровать по строке/столбцу (row/col), или по старому/новому значению (oldValue/newValue)
  
  var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Архив");
  archive.getRange(archive.getLastRow()+1, 1).setValue(
    formatDateTime(new Date())+" " + "[" + ss.getName() + "!" + address + "] '" + (oldValue==undefined?"":oldValue) + "' >> '" + (newValue==undefined?"":newValue) +"'"
  );
};
function formatDateTime(date) {
  var dd = date.getDate();
  if (dd < 10) dd = '0' + dd;
  var mm = date.getMonth() + 1;
  if (mm < 10) mm = '0' + mm;
  var yy = date.getFullYear() % 100;
  if (yy < 10) yy = '0' + yy;
  
  var hh = date.getHours();
  if (hh < 10) hh = '0' + hh;
  var MM = date.getMinutes();
  if (MM < 10) MM = '0' + MM;
  var ss = date.getSeconds();
  if (ss < 10) ss = '0' + ss;
  
  return dd + '.' + mm + '.' + yy + ' ' + hh + ':'+ MM + ':'+ ss;
}const sheetName = 'Sheet1';
const sheet = book.getSheetByName(sheetName);
if(sheet){
  cnsole.log(`Лист с именем ${sheetName} есть`);
}const sheetName = 'Sheet1';
const sheet = book.getSheetByName(sheetName) || book.insertSheet(sheetName);function findArray ($ar, $findValue, $executeKeys){
  $result = array();
  foreach ($ar as $k => $v) {
    if (is_array($ar[$k])) {
      $second_result = findArray ($ar[$k], $findValue, $executeKeys);
      $result = array_merge($result, $second_result);
      continue;
    }
    if ($v === $findValue) {
      foreach ($executeKeys as $val){
        $result[] = $ar[$val];
      }
      
    }
  }
  return $result;
} 
  
  /**
 * @file Dragg down a formula
 * @url https://qna.habr.com/q/709715
 * */
/**
 * User action. Runs the snippet
 */
function run() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const base = sheet.getRange('C3:C');
  const colFormula = sheet.getRange('J3');
  draggDownFormulas_(base, colFormula);
}
/**
 * @param {GoogleAppsScript.Spreadsheet.Range} base
 * @param {GoogleAppsScript.Spreadsheet.Range} colFormula
 */
function draggDownFormulas_(base, colFormula) {
  const baseValues = base.getValues();
  const lastBase =
    baseValues.length - baseValues.reverse().findIndex(row => row[0] !== '');
  const colFormulaFormula = colFormula.getFormula();
  colFormula
    .getSheet()
    .getRange(base.getRow(), colFormula.getColumn(), lastBase)
    .setFormula(colFormulaFormula);
}
C заполнена на одну строку ниже, чем массив данныхJ3$products = $this->getProductList();
if ($products) {$products = $this->getProductList();
if (is_iterable($products)) {$products = $this->getProductList();
if (is_countable($products)) {$params = [
	'cmd' => [
        'kp_num' => 'crm.deal.list?' . http_build_query(
			[
				'filter'	=>  [
					'UF_CRM_***' => '111',
				],
				'select'	=> [
					'ID',
					'COMPANY_ID',
					'STAGE_ID',
					'UF_CRM_***',
					'DATE_MODIFY'
				]
			]
		),
        'ord_num' => 'crm.deal.list?' . http_build_query(
			[
				'filter'	=>  [
					'UF_CRM_***' => '222',
				],
				'select'	=> [
					'ID',
					'COMPANY_ID',
					'STAGE_ID',
					'UF_CRM_***,
					'DATE_MODIFY'
				]
			]
		),
	]
];wget -r -k -l 7 -p -E -nc http://site.com/let obj = {}
for(let i =0; i<1000; i++){
    obj['i'+i]=i
}
console.time('time')
for(let i =0; i<1000; i++){
const objResult = obj['i'+i];
}
console.timeEnd('time')let obj = []
for(let i =0; i<1000; i++){
    obj.push('i'+i)
}
console.time('time')
for(let i =0; i<1000; i++){
    const arrResult = obj.find(el => el === 'i'+i);
}
console.timeEnd('time') 
  
  