Поскольку цены со временем меняются, я не хочу постоянно привязывать цену к другой ячейке. Поэтому я бы хотел, чтобы скрипт устанавливал цену на основе выпадающего списка.
У меня есть Services
лист с Cost
столбцом:
Я бы хотел, чтобы скрипт применял стоимость на основе выбора следующим образом (на листе Selection
):
Вот пример электронной таблицы: https://docs.google.com/spreadsheets/d/1O1rZUstDNSXPdUVXvaDfPO4rAQs2cJWHimfGxbddtNU/edit#gid=232108540
Как установить значение Cost
на листе Services
на лист Selection
со скриптом?
Я не хочу постоянно привязывать значение стоимости к ячейке, так как стоимость может меняться со временем, и я хочу сохранить исторические цены.
Попробуй это:
function cost() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Services');
var rg=sh.getRange(2,1,sh.getLastRow()-1,2);
var vA=rg.getValues();
var costObj = {}
for(var i=0;i<vA.length;i++) {
costObj[vA[i][0]]=vA[i][1];
}
var selsh=ss.getSheetByName('Selection');
var selrg=selsh.getRange(2,1,selsh.getLastRow()-1,2);
var vB=selrg.getValues();
for(var j=0;j<vB.length;j++) {
vB[j][1]=costObj[vB[j][0]];
}
selrg.setValues(vB);
//if you only want to set columnB you can do this instead of the above line
//var vC=vB.map(function(r){return [r[1]]});
//selsh.getRange(2,2,vC.length,1).setValues(vC);
}
Как onEdit():
function cost(e) {//Installable onEdit()
var sh=e.range.getSheet();
var name=sh.getName();
if (name!='Selection')return;
if (e.value && e.range.columnStart==1) {
e.range.offset(0,1).setValue(getCostObj()[e.value]);
}
}
function getCostObj() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Services');
var rg=sh.getRange(2,1,sh.getLastRow()-1,2);
var vA=rg.getValues();
var costObj = {}
for(var i=0;i<vA.length;i++) {
costObj[vA[i][0]]=vA[i][1];
}
return costObj;
}
Это увеличивает стоимость только после того, как мы выполним скрипт, мы можем просто изменить его на onEdit
?
Вероятно, было бы лучше сделать это как функцию ячейки, как предложил @Joshua T. Я думаю, что мы слишком часто используем onEdit.
но это не сохранит исторические цены, если цены изменятся, и я хотел бы сохранить исторические цены? Можем ли мы сделать скрипт таким, чтобы он работал с onEdit
, похоже, этот скрипт сканирует всю колонку и добавляет скрипт, который может быть неэффективным для нужд onEdit
Хорошо. Какое действие пользователя инициирует событие onEdit()? Какая ячейка? Какая колонка? ...
На листе Selection
в раскрывающемся столбце A
следует установить Cost
в столбце B
, в ячейке рядом с раскрывающимся списком
Я подозреваю, что это должен быть устанавливаемый триггер.
Похоже, есть довольно много неправильных вещей, начиная с функции cost
, getCostObj[e.value]
должно быть getCostObj([e.value])
, а функция getCostObj()
должна быть getCostObj(e)
Нет, getCostObj() не срабатывает. Это называется. getCostObj()[e.value] правильно. Cost(e) get срабатывает и вызывает getCostObj();
У меня была неправильная эта строка e.range.offset(0,1).setValue(getCostObj[e.value]);
, и я исправил ее на эту e.range.offset(0,1).setValue(getCostObj()[e.value]);
Почему бы просто не использовать ВПР для поиска выбранной услуги в листе выбора в листе затрат, вот так -
=IFERROR(VLOOKUP(A2,Services!A:B,2,FALSE),0)
?