Установить значение на основе выпадающего выбора с помощью скрипта

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

У меня есть Services лист с Cost столбцом: Установить значение на основе выпадающего выбора с помощью скрипта

Я бы хотел, чтобы скрипт применял стоимость на основе выбора следующим образом (на листе Selection): Установить значение на основе выпадающего выбора с помощью скрипта

Вот пример электронной таблицы: https://docs.google.com/spreadsheets/d/1O1rZUstDNSXPdUVXvaDfPO4rAQs2cJWHimfGxbddtNU/edit#gid=232108540

Как установить значение Cost на листе Services на лист Selection со скриптом?

Почему бы просто не использовать ВПР для поиска выбранной услуги в листе выбора в листе затрат, вот так - =IFERROR(VLOOKUP(A2,Services!A:B,2,FALSE),0)?

Joshua T 28.05.2019 18:29

Я не хочу постоянно привязывать значение стоимости к ячейке, так как стоимость может меняться со временем, и я хочу сохранить исторические цены.

sojim2 28.05.2019 23:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
203
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

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?

sojim2 28.05.2019 23:20

Вероятно, было бы лучше сделать это как функцию ячейки, как предложил @Joshua T. Я думаю, что мы слишком часто используем onEdit.

Cooper 28.05.2019 23:26

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

sojim2 28.05.2019 23:27

Хорошо. Какое действие пользователя инициирует событие onEdit()? Какая ячейка? Какая колонка? ...

Cooper 28.05.2019 23:40

На листе Selection в раскрывающемся столбце A следует установить Cost в столбце B, в ячейке рядом с раскрывающимся списком

sojim2 28.05.2019 23:41

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

Cooper 28.05.2019 23:47

Похоже, есть довольно много неправильных вещей, начиная с функции cost, getCostObj[e.value] должно быть getCostObj([e.value]), а функция getCostObj() должна быть getCostObj(e)

sojim2 29.05.2019 00:16

Нет, getCostObj() не срабатывает. Это называется. getCostObj()[e.value] правильно. Cost(e) get срабатывает и вызывает getCostObj();

Cooper 29.05.2019 00:20

У меня была неправильная эта строка e.range.offset(0,1).setValue(getCostObj[e.value]);, и я исправил ее на эту e.range.offset(0,1).setValue(getCostObj()[e.value]);

Cooper 29.05.2019 00:25

Другие вопросы по теме

Ссылка на содержимое ячейки в качестве имени листа
Скрипт Google Apps получает данные ограниченного листа из импортированного пакета
Наличие нескольких переменных данных
Как уменьшить количество вызовов службы Google App Script
Как заставить Google Sheets привязанный code.js читать и действовать на JavaScript из не содержащегося удаленного файла .js?
Проблема с проверкой данных в пакетном обновлении API Google Таблиц
Как подсчитать строки между двумя непустыми ячейками с их промежуточными пустыми ячейками в Google Sheets?
Автоматически отправлять электронную почту, когда ячейка в столбце имеет определенное значение
Поиск значения с другой вкладки/листа в листах Google на основе ссылки на ячейку
Как объединить отформатированные и неотформатированные ячейки, сохраняя при этом форматирование отформатированной ячейки для применения к объединенной ячейке в Google Таблицах?