工作表2包含所有项目及其状态,而工作表1仅包含工作表2中的某些项目。我希望能够每次看到工作表1上提到的项目具有状态更新(即日期,在工作表2。
这是我到目前为止的内容,但是在调用合适的范围时遇到了麻烦。有没有更简单的方法可以做我想做的事?
function statusupdate() {
var activesht = SpreadsheetApp.getActiveSpreadsheet();
var statussht = activesht.getSheetByName("Sheet 2"); //get sheet on which status update occurs
var statusrng1 = statussht.getRangeByName('B');
var statusrng2 = statussht.getRangeByName('C');
var mainsht = activesht.getSheetByName("Sheet 1"); //get sheet where you show a specific thing has been updated, if that thing mentioned here.
var mainrng = mainsht.getRangeByName('F');
if (statusrng1 == mainrng) {
var date = statusrng2.getValue();
var daterng = mainrng.getRangeByName('E');
daterng.setValues(date);
}
}
最佳答案
电子表格公式
您可以不使用脚本而使一张纸中的行紧随另一张纸中的行。例如,假设我们有一个名为Items
的工作表,其中每行我们携带的物品都包含一行,而物品编号在第一列中。
我们可以使用VLOOKUP()
搜索包含有关单个项目信息的行,并从中选择特定的列。
例如,此公式将在B2中使用,并且可以复制到工作表中的其他单元格中:
=VLOOKUP($A2,Items!$A$2:$C$7,COLUMN(),false)
脚本
您的脚本存在一些问题。
.getRangeByName('B')
-此方法获取命名范围。给定名称,我怀疑您的意思是获取列B,而不是命名范围。如果是这样,您可以改用以下方法:var statusrng1 = statussht.getRange('B:B');
在A1Notation中,范围
B:B
是整个列B。您打算复制值,因此除了确定范围外还需要执行另一步;您需要先从某个范围读取值,然后再将它们写入其他范围。为此,您需要使用
getValues()
和setValues()
.之类的方法这是脚本的更新版本,适用于上述示例电子表格。
function statusupdate() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
//get sheet on which status update occurs
var statusSheet = ss.getSheetByName("Items");
var statusRange = statusSheet.getDataRange();
var statusData = statusRange.getValues();
//get sheet where you show a specific thing has been updated, if that thing mentioned here.
var trackingSheet = ss.getSheetByName("Tracking");
var trackingRange = trackingSheet.getDataRange();
var trackingData = trackingRange.getValues();
// Loop over all rows in the Tracking sheet to update from the Items sheet
// Start with row=1, because row 0 contains headers
for (var row=1; row<trackingData.length; row++) {
var item = trackingData[row][0];
if (item == '') continue; // skip rows without item #
// Look for item in Items sheet
var statusRow = null;
for (var sRow=1; sRow<statusData.length; sRow++) {
if (statusData[sRow][0] == item) {
// Found our match, grab that row
statusRow = statusData[sRow];
break;
}
}
// If we found a matching row, copy the status
if (statusRow) {
// Customize this depending on how your sheets are organized
trackingData[row][1] = statusRow[1];
trackingData[row][2] = statusRow[2];
}
}
// All values have been copied to trackingData, now write to sheet
trackingRange.setValues(trackingData);
}