Как увеличить i до следующего вызова?

#google-apps-script #google-sheets

#google-apps-script #google-sheets

Вопрос:

При каждом запуске функции celltest () я хочу увеличить значение i

 function cell_test () {
   var i=8 ;
   var ss = SpreadsheetApp.getActiveSpreadsheet ();
   var source = ss.getRange ("A!C1");
   var destSheet = ss.getSheetByName("B");
   var destRange = destSheet.getRange(i,2);
   source.copyTo (destRange, {contentsOnly: true});


}
  

Этот код работает, как показано ниже…

Когда он вызывает cell_test (), он копирует значение из A!C1 и вставляет его в ячейку листа B (8.2) (i = 8).

При следующем вызове я хочу увеличить значение i 1 и вставить его в позицию ячейки (9.2) (i = 9).

Как увеличивать значения i при каждом cell_test ()?

Пожалуйста, помогите мне. Спасибо

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

1. Что такое «i»? Всегда 8, когда вы открываете электронную таблицу? Первая пустая строка B? И как выполняется cell_test, из меню, пользовательской формулы, onEdit?

2. целевой ячейкой является лист B (8.2), который я хочу вставить. итак, я присваиваю i значение 8. Затем я вставлю значение в таблицу B (9.2).

3. Вы не ответили на мои вопросы.

Ответ №1:

Сохранение и увеличение переменной в службе свойств

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

 function initI() {
  PropertiesService.getScriptProperties().setProperty('i',8);
  return Number(PropertiesService.getScriptProperties().getProperty('i'));
}

function incrI() {
  var ps=PropertiesService.getScriptProperties();
  var i=Number(ps.getProperty('i'));
  ps.setProperty('i',i 1);
}

function getI() {
  var ps=PropertiesService.getScriptProperties();
  var pObj=ps.getProperties(); 
  if(pObj.hasOwnProperty('i')) {
     var i=Number(ps.getProperty('i'));
    return i;
  }else{
    return initI();
  }
}

function cell_test() {
  var i=getI();
  var ss = SpreadsheetApp.getActiveSpreadsheet ();
  var source = ss.getRange ("A!C1");
  var destSheet = ss.getSheetByName("B");
  var destRange = destSheet.getRange(i,2);
  source.copyTo (destRange, {contentsOnly: true});
  incrI();
}
  

Это удобно, потому что все, что вам нужно сделать, это добавить var i=getI(); в начале любой тестовой функции и в incrI(); конце вашей тестовой функции, а об остальном позаботятся. Если ваш I не определен в службе свойств, getI () позаботится об этом за вас. Если вы хотите начать все сначала, вы можете просто запустить initI (), и это установит для него значение по умолчанию, которое в настоящее время равно 8. Если вы хотите изменить значение по умолчанию, просто измените 8 в initI () и готово. Вы можете полностью удалить значение PropertiesService для in в диалоговом окне Files / Project Properties /Script Properties.

Ответ №2:

Вы можете создать i параметр функции и вызвать функцию из цикла for:

 function main() {
  var startRow = 8;
  var endRow = 10;

  for(var i=startRow; i<=endRow; i  ) {
    cell_test(i);
  }
}

function cell_test(i) {
   var ss = SpreadsheetApp.getActiveSpreadsheet ();
   var source = ss.getRange ("A!C1");
   var destSheet = ss.getSheetByName("B");
   var destRange = destSheet.getRange(i,2);
   source.copyTo (destRange, {contentsOnly: true});
}
  

Это скопирует содержимое ячейки A!C1 в ячейку B!B8 , B!B9 и B!B10 .

Ответ №3:

Я не знаю, нужно ли сбрасывать i или как выполняется cell_test, но это увеличит i при каждом запуске функции.

 function cell_test() {
  try {
    // Increment i
    var props = PropertiesService.getScriptProperties();
    var i = props.getProperty("Test");
    if( i === null ) {
      i = 8;
    }
    else {
      i  ;
    }
    props.setProperty("Test", i);
    // Put your code here
    var ss = SpreadsheetApp.getActiveSpreadsheet ();
    var source = ss.getRange ("A!C1");
    var destSheet = ss.getSheetByName("B");
    var destRange = destSheet.getRange(i,2);
    source.copyTo (destRange, {contentsOnly: true});
  }
  catch(err) {
    Logger.log(err);
  }
}