Скрипт приложения не зависит от позиции столбца - PullRequest
1 голос
/ 07 апреля 2020

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

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

Я сделал небольшую функцию, которая облегчит написание кода.

Вывод функции будет сохранен на листе, а затем я скопирую вставьте его в функцию скрипта моего приложения.

С моим подходом все в порядке или есть лучший способ сделать это?


function get_headers(){
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheets=ss.getSheets();
  var fin=[];

    var tsheet=ss.getSheetByName("Product");
    var shtname=tsheet.getName();
    var [hd_Product, ...data_Product] = tsheet.getDataRange().getDisplayValues();
    for (j=0;j<hd_Product.length;j++) {  fin.push("const "+shtname+"_"+hd_Product[j]+"=hd_product.indexOf('"+hd_Product[j]+ "');") };
Browser.msgBox(fin);
  //tsheet.getRange(tsheet.getLastRow(), 1, fin.length, fin[0].length).setValues(fin);



The below code - for running it for all the shets is not woeking.

  for (i=0;i<sheets.length;i++){
    var shtname=sheets[i].getName();
    var tsheet=ss.getSheetByName(shtname);
    var [header, ...data] = tsheet.getDataRange().getDisplayValues();
    for (j=0;j<header.length;j++) {
      fin.push("const "+shtname+"_"+header[j]+"=header.indexOf('"+header[j]+ "');") ;
    }//for j

Browser.msgBox(fin);


}//for i





//Browser.msgBox(fin);

}

//
//


function process(){

const Product_Code=hd_product.indexOf('Code');
const Product_Item=hd_product.indexOf('Item');
const Product_UOM=hd_product.indexOf('UOM');
const Product_CAT=hd_product.indexOf('CAT');
const Product_Price=hd_product.indexOf('Price');
const Product_Min_Stock=hd_product.indexOf('Min_Stock');
const Product_Lot=hd_product.indexOf('Lot');
const Product_Now_Stock=hd_product.indexOf('Now_Stock');
const Product_Upd_Date=hd_product.indexOf('Upd_Date');
const Product_Vendor1=hd_product.indexOf('Vendor1');
const Product_Vendor2=hd_product.indexOf('Vendor2');
const Product_Vendor3=hd_product.indexOf('Vendor3');




}




Ответы [ 3 ]

2 голосов
/ 07 апреля 2020

Лучше всего связать DeveloperMetaData с этим столбцом:

const setup = () => {
  const sh = SpreadsheetApp.getActive().getSheets()[0];
  const setupHeaders = new Map([
    ['Code', 'A:A'],// associate 'Code' with range A:A/Col 1
    ['Item', 'B:B'],
  ]);
  setupHeaders.forEach((range, header) =>
    sh.getRange(range).addDeveloperMetadata('secretTag', header)
  );
};

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

const getDevMeta_ = () =>
  new Map(
    SpreadsheetApp.getActive()
      .createDeveloperMetadataFinder()
      .withKey('secretTag')
      .withLocationType(SpreadsheetApp.DeveloperMetadataLocationType.COLUMN)
      .find()
      .map(md => [md.getValue(), md.getLocation().getColumn()])
  );
const getColumnsForHeaders = (headers = ['Item', 'Code']) => {
  const map = getDevMeta_();
  return headers.map(header => map.get(header));
};
const test1 = () => console.log(getColumnsForHeaders(['Code', 'Item'])); //returns current location of code and item

Ссылки:

Руководство по метаданным разработчика

1 голос
/ 07 апреля 2020
function myFunction() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const rg=sh.getDataRange();
  const vA=rg.getValues()
  //Just learn how to use the next 3 or 4 lines and it's pretty easy you can integrate them into any code
  const hA=vA[0];//this is the header row with a [0] index at the end to flatten it out to a single dimension array.
  const col={};//returns column from header name
  const idx={};//returns index from header name
  hA.forEach(function(e,i){col[e]=i+1;idx[e]=i;});//this is the loop to fill in the objects above depending upon whether you want indexes or columns
  //Example of how to use them
  vA.forEach(function(r,i){}) {
    r[idx[headername]];//referring to an index with column header
    sh.getRange(i+1,col[headername]).setValue();//reffering to a column with header name
  }
0 голосов
/ 07 апреля 2020

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

Простой способ вернуть номер столбца будет следующим:

function myFunction() {
  var searchedHeader = "Hello World";
  var column = returnColumn(searchedHeader); 
}

function returnColumn(header) {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var tsheet=ss.getSheetByName("Product");
  var headers = tsheet.getRange(1, 1, 1, tsheet.getLastColumn()).getValues();
  var column = (headers[0].indexOf(header) + 1);
  if (column != 0) {
    return column;
  }
}

Вы можете использовать переменную Dynami c column хранение номера столбца для выполнения всех видов запросов, например

var range = tsheet.getRange(5, column);

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