首页 > 解决方案 > 应用脚本不依赖于列位置

问题描述

我希望能够在我的数据中插入列或重新排列列位置而不影响 appscript 功能。

我没有通过数字来引用列位置,而是通过标题值来引用它们(我不会更改名称)。

我做了一个小函数,可以很容易地编写代码。

该函数的输出将存储在工作表中,然后我会将其复制粘贴到我的应用程序脚本函数中。

我的方法没问题还是有更好的方法来做到这一点?


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');




}




标签: google-apps-script

解决方案


更好的方法是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

参考:

开发者元数据指南


推荐阅读