onEdit
- зарезервированное имя функции для простого триггера.getRichTextValue()
, возвращаемый объект имеет метод getLinkUrl()
.cell.getRichTextValue().getLinkUrl();
/**
*
* @param {GoogleAppsScript.Spreadsheet.Range} ref
*/
function extractLink_(ref) {
const richTextValues = ref.getRichTextValues();
return richTextValues.map((row) =>
row.map((cell) => {
return cell.getLinkUrl();
}),
);
}
arrNewData.push([arrData[n].join()]);
function runMoveData() {
// Лист-источник
const frm = SpreadsheetApp.getActive().getSheetByName('Перенос или копирование строк. База');
// Лист-приемник
const to = SpreadsheetApp.getActive().getSheetByName('Перенос или копирование строк');
// Проверка для каждой строки: если 3й элемент дата, то переноси
const condition = (row) => !!row[2]?.getTime;
moveData_(frm, to, condition, { colors: true, notes: true });
}
// Лист-источник
const frm = SpreadsheetApp.getActive().getSheetByName('Перенос или копирование строк. База');
// Лист-приемник
const to = SpreadsheetApp.getActive().getSheetByName('Перенос или копирование строк');
// Преобразователь в значение для сравнения
const toValue = (data) => (data?.getTime ? data.getTime() : data);
// Индекс приемника, то что в нем уже есть
const toIndex = to
.getDataRange()
.getValues()
.map((row) => toValue(row[2]));
// Проверка для каждой строки: если третий элемент дата и такого значения нет в примнике, то копируй
const condition = (row) => row[2]?.getTime && !toIndex.includes(toValue(row[2]));
moveData_(frm, to, condition, { colors: true, notes: true, leaveCopy: true });
/**
*
* @param {string} companyName
* @param {string} contactName
* @param {('Да'|'Нет')} informStatus
* @param {string} phone
* @param {string} email
* @returns
*/
function addCompany_(companyName, contactName, informStatus, phone, email) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Создавать список и чекбокс');
// Создаем объекты для чекбокса и компании
var company = companyName;
const companyId = `${String(companyName).toUpperCase().replace(/\s+/, '_')}_${new Date()}`;
var newRow = [companyId, false, company, contactName, informStatus, phone, email];
const lr = sheet.getLastRow() + 1;
sheet.appendRow(newRow);
const validations = sheet.getRange('2:2').getDataValidations();
sheet.getRange(`${lr}:${lr}`).setDataValidations(validations);
return companyId;
}
/* exported runAddCompany */
function runAddCompany() {
addCompany_(`Comp_${new Date().getTime()}`, 'Contact', 'Да', '77777777777', 'qerwerq@afaffa.ru');
}
class Recalculator {
constructor(calcs) {
this.calcs = calcs;
}
calc(params, fix) {
if (params.filter((p) => p === '' || isNaN(p)).length > 1)
return params.map((p) => (isNaN(p) || p === '' ? '' : Number(p)));
const index = params.map((p) => (isNaN(p) || p === '' ? '' : Number(p))).findIndex((p) => p === '');
if (index === -1) return params.map((v, i) => (i === fix ? v : ''));
const res = this.calcs[index](params);
const out = [...params];
out[index] = Number.isInteger(res) ? res : Number(res).toFixed(2);
return out;
}
}
const recalc = new Recalculator([([_, b, c]) => c - b, ([a, _, c]) => c - a, ([a, b, _]) => a + b]);
const range = sheet.getRange('B3:F3');
const [a, _, b, __, c] = range.getValues()[0];
const params = [a, b, c];
const [a1, b1, c1] = recalc.calc(params, fix);
range.setValues([[a1, _, b1, __, c1]]);