Код листа Google - Изменить, добавить строку из листа1 в лист2 после нажатия кнопки - PullRequest
0 голосов
/ 18 мая 2018

Мне нужна ваша помощь в отношении моего сценария ниже.У меня есть 2 листа (sheet1 и sheet2).Sheet1 содержит значения ячеек, в которые это будет скопировано / для обновления ячеек на sheet2.Сценарий добавит и скопирует значения из листа1 в лист2, но не распознает условие.Я бы хотел, чтобы sheet2!c3 = sheet1!f5 просто обновил ячейки, иначе он добавит еще одну строку и скопирует данные из листа1 в лист2.

Спасибо за помощь!

function emailongoing() {
   var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('OutageYellow');            
   var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('test');            
   var lastRow = sheet2.getLastRow()+1;

  cntr = 0

  if (sheet2.getRange('C3') != sheet1.getRange('F5')) {
  sheet1.getRange('E5').copyTo(sheet2.getRange(lastRow + cntr,2), {contentsOnly:true}); 
  sheet1.getRange('F5').copyTo(sheet2.getRange(lastRow + cntr,3), {contentsOnly:true});
  sheet1.getRange('C5').copyTo(sheet2.getRange(lastRow + cntr,5), {contentsOnly:true});
  sheet1.getRange('C7').copyTo(sheet2.getRange(lastRow + cntr,4), {contentsOnly:true});
  sheet1.getRange('C8').copyTo(sheet2.getRange(lastRow + cntr,9), {contentsOnly:true});
  sheet1.getRange('C9').copyTo(sheet2.getRange(lastRow + cntr,10), {contentsOnly:true});
    cntr++;
  }


  else if (sheet2.getRange('C3') != " ") {
  sheet1.getRange('E5').copyTo(sheet2.getRange(lastRow + cntr,2), {contentsOnly:true}); 
  sheet1.getRange('F5').copyTo(sheet2.getRange(lastRow + cntr,3), {contentsOnly:true});
  sheet1.getRange('C5').copyTo(sheet2.getRange(lastRow + cntr,5), {contentsOnly:true});
  sheet1.getRange('C7').copyTo(sheet2.getRange(lastRow + cntr,4), {contentsOnly:true});
  sheet1.getRange('C8').copyTo(sheet2.getRange(lastRow + cntr,9), {contentsOnly:true});
  sheet1.getRange('C9').copyTo(sheet2.getRange(lastRow + cntr,10), {contentsOnly:true});
    cntr++;
  }

}

1 Ответ

0 голосов
/ 18 мая 2018

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

https://medium.com/dailyjs/back-to-roots-javascript-value-vs-reference-8fb69d587a18

Согласно документации, метод getRange () класса Sheet возвращает экземпляр объекта Range.

https://developers.google.com/apps-script/reference/spreadsheet/range

Поскольку объекты в JS передаются по ссылке, а не по значению (см. 1-ую ссылку), сравнение этих двух экземпляров Range похоже на вопрос, занимают ли эти объекты одно и то же место в памяти.Очевидно, что это не так, поскольку getRange ("C3") НЕ совпадает с getRange ("F5").Опять же, в случае объектов, которые сравниваются, это ссылки на то, где они хранятся в памяти, а не действительные свойства и значения в них.

С другой стороны, примитивные значения (включая строки) передаютсязначение, так что вы можете сравнить их.Однако, есть предостережения, когда вы создаете переменные как объекты в первую очередь путем явного вызова соответствующего конструктора.Учтите это:

new Number(5) == 5 //logs true because abstract comparison is used. The object is downcast to the primitive type

new Number(5) === 5 //logs false when used with strict comparison that also compares types

new Number(5) == new Number(5) //logs false - type coersion not required, references are not equal

new Number(5) === new Number(5) //logs false  - references are not equal

Вы должны вызвать методы getValue () или getValues ​​() для объекта Range, чтобы получить значения, которые вы можете сравнить из ячеек листа.Наконец, повторение диапазона по одной ячейке за раз является ужасной практикой, которая сделает ваш сценарий чрезвычайно медленным.Подробности см. В этом ответе Копирование / передача данных из массива в диапазон листов по одной строке за раз с использованием Google Apps Script

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