工作表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);
}
}
答案 0 :(得分:2)
您可以让一张表中的行跟随另一张表中的行而不使用脚本。例如,假设我们有一张名为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);
}