не удается настроить целевую ячейку на листе (скрипт приложения Google)

#google-apps-script #google-sheets

#google-приложения-скрипт #google-листы

Вопрос:

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

A B C D E F
Дата Названия других листов Месяц День Будний день Опции

введите описание изображения здесь

Остальные листы должны начинаться 16-го числа месяца и заканчиваться 15-го числа следующего месяца. Таким образом, на листе с надписью (2023/01) даты начинаются с строки 7. Даты указаны в столбце А, а значение, подлежащее обновлению, — в столбце D.

введите описание изображения здесь

Проблема

В сценарии все даты смещены на единицу. Поэтому, если вы выберете 23/01/16, это на самом деле соответствует 23/01/17. Похоже, это не проблема, за исключением случаев, когда выбрано 15-е число каждого месяца. Поскольку листы заканчиваются 15-го числа, а даты смещены, они совпадают с 16-м, но 16-го числа на листе не существует, поэтому ячейка не обновляется.

MY solution

To fix this issue I created a condition to check if the selected date includes ‘/16’ then run some code. I then created a variable to get the previous sheet and got the last row and set the value that way. I used toast() to check if the values I am selecting are correct and they seem to be. The sheet name is correct and the last row is correct but I am not actually seeing the cell being updated. I am not sure what I am doing wrong so any help would be greatly appreciated.

 /* 休日入力イベント --------------------------------------*/ function changeHoliday(ss) {  var sheet = ss.getActiveSheet(); //アクティブなシート  var sheetName = sheet.getSheetName();  var atvc = sheet.getActiveCell(); //アクティブセル   //休日シートの休日を変更した時だけ  if(sheetName=='休日' || sheetName amp;amp; atvc.getColumn() == 6){  var flag = atvc.getValue(); //休日かどうか  var targetSheetName = String(atvc.offset(1, -4).getValue()); //対応するシート名   //Get previous sheet name  var prevSheetName = String(atvc.offset(-1,-4).getValue());    var targetDate = Utilities.formatDate(atvc.offset(1, -5).getValue(),"JST", "yyyy/MM/dd"); //対応する日付  // var targetDateEndofSheet = Utilities.formatDate(atvc.offset(0, -5).getValue(),"JST", "yyyy/MM/dd");   var targetSheet = ss.getSheetByName(targetSheetName);  var lastRow = targetSheet.getLastRow();  var values = targetSheet.getRange(1,1,lastRow,1).getValues();  // 取得したデータから一致する日付を探す  //original i=7    for (var i=7; ilt;lastRow; i  ){  var d = Utilities.formatDate(values[i][0],"JST", "yyyy/MM/dd");   //My if statement  if(targetDate.includes("/16")) {   var targetS = ss.getSheetByName(prevSheetName); //get the pervious sheet  var lastR = targetS.getLastRow(); //get the last row of the previous sheet   //check the values  ss.toast( "prev sheet name "   prevSheetName  "last r: "   lastR   "flag"   flag   "td "   targetDate)  //select the cell 4 of the last row  var r = prevSheetName.getRange(lastR,4);   r.setValue(flag); //set the select value  }  if(d == targetDate){    var range = targetSheet.getRange(i,4);   // データ追加  range.setValue(flag);  }  }  }  //一度に1つの日付を入力してください     }   /* 休日の保護の解除 --------------------------------------*/ function protectionRemove_(targetDate){  var ss = SpreadsheetApp.getActive();  var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);   for (var i = 0; i lt; protections.length; i  ) {  var protection = protections[i];  // 説明文が一致したら削除  if (protection.getDescription() == targetDate) {  protection.remove();  }  } }   

Я смог решить эту проблему с помощью некоторых предложений, высказанных в комментариях

Я добавил это в свой код

 if(d.includes("/16") amp;amp; targetDate.includes("/16")) {  var prevSheetName = String(atvc.offset(-1, -4).getValue()); //get target page  var targetSheet = ss.getSheetByName(prevSheetName);   var lr= targetSheet.getLastRow(); //select the last of the target page  var r = targetSheet.getRange(lr,4); //set the range  r.setValue(flag);  }  

Комментарии:

1. Я должен извиниться за свое плохое знание английского языка. Что такое 2 изображения? Какова самая левая колонка изображения листа в нижней части? На ваших изображениях приведены примеры ситуаций ввода? Если я правильно понимаю, можете ли вы предоставить примеры выходных ситуаций, которые вы ожидаете? Из if you select 23/01/16 it actually matches 23/01/17 вашей электронной таблицы видно , что часовой пояс электронной таблицы совпадает с проектом сценария Google Apps? Я не могу понять Since the sheets end on the 15th and the dates are offset it matches the 16th but the 16th does not exist on the sheet so the cell is not updated. .

2. I) Что ты хочешь сделать? II) Пожалуйста, войдите atvc.offset(1, -5).getValue() и targetDate . III) Почему вы должны перейти date в string ?

3. @Tanaike Поскольку я изначально не писал этот код, я не уверен, почему некоторые вещи написаны так, как они есть. На первом изображении 23/2/16-это значение, которое проверяется в цикле, на самом деле 23/2/17. На втором изображении вы можете видеть, что лист заканчивается 23/2/15. Поэтому, если я выберу 23/02/15 на первом листе, на втором листе не будет значения 23/02/16. Я надеюсь, что в этом больше смысла. Мне жаль, если я плохо это объяснил.

4. @idfurw Я попробовал ваше решение, и, похоже, оно выбирает разные даты. Например, если на первом листе я выбираю 23/01/16, то в месячном листе выбирается 23/01/17. Я попытался изменить смещение целевой даты с 1 на 0, но затем это дало мне неожиданные результаты. Он выберет две даты.

5. Спасибо, что ответили. Я снова должен извиниться за свое плохое знание английского языка. Я не могу понять if I select 23/02/15 in the first sheet there is no value 23/02/16 on the second sheet. . И в вашем сценарии, как вы запускаете функцию changeHoliday и protectionRemove_ ?

Ответ №1:

Пожалуйста, найдите мое объяснение в комментариях:

 function changeHoliday(ss) {  var sheet = ss.getActiveSheet(); //アクティブなシート  var sheetName = sheet.getSheetName();  var atvc = sheet.getActiveCell(); //アクティブセル   //休日シートの休日を変更した時だけ  /* Should be AND OPERATOR */  if(sheetName=='休日' amp;amp; sheetName amp;amp; atvc.getColumn() == 6){  var flag = atvc.getValue(); //休日かどうか  /* Should check the value */  if (flag == '休日') {  /* Row offset should be 0 */  var targetSheetName = String(atvc.offset(0, -4).getValue()); //対応するシート名   //Get previous sheet name  /* Not needed */  // var prevSheetName = String(atvc.offset(-1,-4).getValue());   /* Row offset should be 0 */  var targetDate = Utilities.formatDate(atvc.offset(0, -5).getValue(),"JST", "yyyy/MM/dd"); //対応する日付  // var targetDateEndofSheet = Utilities.formatDate(atvc.offset(0, -5).getValue(),"JST", "yyyy/MM/dd");   var targetSheet = ss.getSheetByName(targetSheetName);  var lastRow = targetSheet.getLastRow();  var values = targetSheet.getRange(1,1,lastRow,1).getValues();  // 取得したデータから一致する日付を探す  //original i=7   /* i should starts from 6 */  for (var i=6; ilt;lastRow; i  ){  var d = Utilities.formatDate(values[i][0],"JST", "yyyy/MM/dd");   //My if statement  /* Not needed */  /*  if(targetDate.includes("/16")) {   var targetS = ss.getSheetByName(prevSheetName); //get the pervious sheet  var lastR = targetS.getLastRow(); //get the last row of the previous sheet   //check the values  ss.toast( "prev sheet name "   prevSheetName  "last r: "   lastR   "flag"   flag   "td "   targetDate)  //select the cell 4 of the last row  var r = prevSheetName.getRange(lastR,4);   r.setValue(flag); //set the select value  }  */  if(d == targetDate){    /* Row should be i   1 */  var range = targetSheet.getRange(i   1,4);   // データ追加  range.setValue(flag);   /* Better to break */  break;  }  }  }  }  //一度に1つの日付を入力してください     }  

Чтобы упростить:

 function changeHoliday(ss) {  var sheet = ss.getActiveSheet();  var sheetName = sheet.getSheetName();  var atvc = sheet.getActiveCell();   if(sheetName=='休日' amp;amp; sheetName amp;amp; atvc.getColumn() == 6){  var flag = atvc.getValue();  if (flag == '休日') {  var targetSheetName = String(atvc.offset(0, -4).getValue());  var targetDate = Utilities.formatDate(atvc.offset(0, -5).getValue(),"JST", "yyyy/MM/dd"); //対応する日付  var targetSheet = ss.getSheetByName(targetSheetName);  var lastRow = targetSheet.getLastRow();  var values = targetSheet.getRange(1,1,lastRow,1).getValues();   for (var i=6; ilt;lastRow; i  ){  var d = Utilities.formatDate(values[i][0],"JST", "yyyy/MM/dd");  if(d == targetDate){  var range = targetSheet.getRange(i   1,4);  range.setValue(flag);  break;  }  }  }  } }  

Комментарии:

1. Спасибо, мое решение сработало, но это намного чище.