Функция сценария не найдена - PullRequest
0 голосов
/ 04 января 2019

Я создал рубрику, в которой есть ячейки, которые меняют цвет при добавлении «хх» в ячейку.Вместо того, чтобы вводить в каждую отдельную ячейку при оценке моих учеников, я хотел, чтобы xx были добавлены в ячейку после нажатия на ячейку.Именно тогда я начал искать и начал исследовать сценарии.Я добавил 2 рисунка в каждую ячейку, чтобы я мог щелкнуть по одному изображению, чтобы добавить «xx», и щелкнуть по другому изображению, чтобы удалить «xx» (если я изменил их рейтинг оценки).Я играл с ними сегодня и добился успеха в первой ячейке, но каждая другая ячейка, которой я пытаюсь назначить сценарий, говорит, что сценарий не может быть найден.Когда я «запускаю» скрипт из файла скрипта, он появляется на моем листе, но не тогда, когда я нажимаю на ячейку так, как хочу.

Вот часть моего кода для первой строкирубрика (у меня 15 строк с разными названиями - устное общение, полномочия и т. д.):

Верхний ряд рубрики предварительно нажмите

Top row of rubric pre-click

Верхний ряд рубрики после клика

[Top row of rubric post-click2]

function verbalcommunication4() {
ss=SpreadsheetApp.getActiveSpreadsheet()
s=ss.getActiveSheet()
var currVal=s.getRange("D5").getValue()
var plusVal= currVal +" xx"
s.getRange("D5") .setValue(plusVal)
}
function verbalcommunication4clear() {
ss=SpreadsheetApp.getActiveSpreadsheet()
s=ss.getActiveSheet()
var currVal=s.getRange("D5").getValue()
var text =s.getRange("D5").getValue().replace(" xx","");
  s.getRange("D5").setValue(text);
}
function verbalcommunication3() {
ss=SpreadsheetApp.getActiveSpreadsheet()
s=ss.getActiveSheet()
var currVal=s.getRange("E5").getValue()
var plusVal= currVal +" xx"
s.getRange("E5") .setValue(plusVal)
}
function verbalcommunication3clear() {
ss=SpreadsheetApp.getActiveSpreadsheet()
s=ss.getActiveSheet()
var currVal=s.getRange("E5").getValue()
var text =s.getRange("E5").getValue().replace(" xx","");
  s.getRange("E5").setValue(text);
}
function verbalcommunication2() {
ss=SpreadsheetApp.getActiveSpreadsheet()
s=ss.getActiveSheet()
var currVal=s.getRange("F5").getValue()
var plusVal= currVal +" xx"
s.getRange("F5") .setValue(plusVal)
}
function verbalcommunication2clear() {
ss=SpreadsheetApp.getActiveSpreadsheet()
s=ss.getActiveSheet()
var currVal=s.getRange("F5").getValue()
var text =s.getRange("F5").getValue().replace(" xx","");
  s.getRange("F5").setValue(text);
}
function verbalcommunication1() {
ss=SpreadsheetApp.getActiveSpreadsheet()
s=ss.getActiveSheet()
var currVal=s.getRange("G5").getValue()
var plusVal= currVal +" xx"
s.getRange("G5") .setValue(plusVal)
}
function verbalcommunication1clear() {
ss=SpreadsheetApp.getActiveSpreadsheet()
s=ss.getActiveSheet()
var currVal=s.getRange("G5").getValue()
var text =s.getRange("G5").getValue().replace(" xx","");
  s.getRange("G5").setValue(text);
}

verbalcommunication4 и verbalcomunication4clear работают отлично.Все остальные сценарии, которые я пытаюсь прикрепить к чертежам в других ячейках, прикрепляются без ошибок, но когда я щелкаю по объекту для запуска сценария, я получаю сообщение об ошибке «Функция сценария« имя сценария »не найдена».Как я уже сказал, когда я запускаю сценарий со страницы проекта сценария, появляется желаемый результат (xx в соответствующей ячейке), но не тогда, когда я нажимаю на чертеж ячейки так, как хочу.

Верхняя строка после сценария«запустить» со страницы проекта

Top row after script is

Верхняя строка после щелчка по чертежу ячейки E5

Top row after cell E5's drawing is clicked

Я новичок в этом, поэтому любая помощь будет оценена.Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 января 2019

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

Я использовал функцию vc и функцию vcc вместе с некоторыми меньшими промежуточными функциями, чтобы мне не пришлось выписывать их все.Но это в основном те же функции, что и у вас, за исключением локальных переменных через переменную.

function vc(a1) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet()
  var cv=sh.getRange(a1).getValue();
  var pv= cv +" xx";
  sh.getRange(a1).setValue(pv);
  SpreadsheetApp.flush();  
}

function vcc(a1) {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sh=ss.getActiveSheet();
  var cv=sh.getRange(a1).getValue();
  var txt =sh.getRange(a1).getValue().replace(" xx","");
  sh.getRange(a1).setValue(txt);
  SpreadsheetApp.flush();
}

function vcD5(){
  vc('D5');
}
function vccD5(){
  vcc('D5');
}
function vcE5(){
  vc('E5');
}
function vccE5(){
  vcc('E5');
}
function vcF5(){
  vc('F5');
}
function vccF5(){
  vcc('F5');
}
function vcG5(){
  vc('G5');
}
function vccG5(){
  vcc('G5');
}

И эта функция создает боковую панель со всеми кнопками.

function createSideBar(){
  var vA=['D5','E5','F5','G5']
  var vB=['green','yellow','red','blue']
  var s='<style>input[type="button"]{padding:2px;margin:2px;width:100px;height:35px;}</style>';
  for(var i=0;i<4;i++){
    s+=Utilities.formatString('<div style="border:2px solid %s;"><br /><input type="button" value="%s" onClick="google.script.run.vc%s();" />',vB[i],vA[i],vA[i]);   
    s+=Utilities.formatString('<input type="button" value="%sc" onClick="google.script.run.vcc%s();" /></div>',vA[i],vA[i]);   
  }
  s+='<br /><input type="button" value="Close" onClick="google.script.host.close()" />';
  var userInterface=HtmlService.createHtmlOutput(s);
  SpreadsheetApp.getUi().showSidebar(userInterface);
}
0 голосов
/ 04 января 2019

Ваш код использует глобальные переменные вместо локальных, и он не использует терминаторы предложений (точки с запятой) во всех строках кода, которые могут иметь их.

Хотя это не обязательно делать по-другому, это может привести к неожиданным результатам, особенно когда мы не совсем уверены в том, как работает Google Apps Script и JavaScript.

Примечание.Для удобства чтения добавьте пробелы перед и после каждого оператора присваивания переменных, например =.

Замените каждый

 ss=SpreadsheetApp.getActiveSpreadsheet()

на

 var ss = SpreadsheetApp.getActiveSpreadsheet();

и т. Д.

Кроме того, удалите пробел и добавьте конечную точку с запятой в

s.getRange("E5") .setValue(plusVal)

Получившийся оператор должен выглядеть следующим образом:

s.getRange("E5").setValue(plusVal);

Сделайте то же самое для других похожих операторов.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...