google-apps-script - 应用脚本不依赖于列位置
问题描述
我希望能够在我的数据中插入列或重新排列列位置而不影响 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');
}
解决方案
更好的方法是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
参考:
推荐阅读
- wget - wget:如何排除某些已知之外的子域?
- android - React Native Android:找不到标签-1的视图管理器可能是由React Native Reanimated引起的
- mysql - 在 MySQL 中连续存储每个产品的时间序列数据的最佳方法
- c# - 使用嵌套类构建 xUnit 测试
- html - 固定底部的 CSS 媒体查询位置元素不相对于父元素
- javascript - 在异步函数中放置等待的位置
- ios - 旋转效果在导航视图中未按预期工作,但在不在导航视图中的任何其他视图中按预期工作
- wso2-am - 如何为负载均衡器配置分析仪表板
- go - 如何改进我的加扰字符串函数,它可能包含不同的符号、数字和字符串 Golang?
- c++ - 为什么没有隐式或默认的 swap()?