1

私はクライアントのために、完全な自律性を最終目標としていくつかのスクリプトを書いています。完了すると、スプレッドシートは常に永久に機能します。とにかく理想的です。

他のシートからの情報が必要なので、 以外の方法でそれらにアクセスする必要があります.getActiveSheet()。クライアントがシートの名前を変更したり、シートの順序を変更したりする可能性があるため、それらの変更後でも機能する方法でシートにアクセスする必要があります。これは除外されgetSheetByName()ますgetSheets()[SHEET_NUMBER](繰り返しになりますが、クライアントはシートの名前を変更したり、順序を変更したりする可能性があります)。しかし、「gid」だから可能なはずです。各シートには異なる gid があり、シートの順序を変更したり、名前を変更したりしても変更されません (各シートの URL の最後までスクロールして、意味を確認してください)。

すべての URL アクセスは FIRST シートのみを開きます。たとえば 、最後に「gid」部分を含めてSpreadsheetApp.openById(SHEET_ID).getDataRange().getValues() 、最初のシートの値を返します。とと同じです。openByIdopenFile

私の質問は、シートの名前を変更したり、スプレッドシート内でシートを並べ替えたりした後でも機能する方法でシートにアクセスするにはどうすればよいですか?

4

2 に答える 2

2

メソッドはありませんが、 getSheetId()getSheetByIdを使用して独自のメソッドを作成できます。ここ:

function sheetsIdMap() {
  var sheetsById = {};
  SpreadsheetApp.getActive().getSheets().forEach(function(s){ sheetsById[s.getSheetId()] = s; });

  //just checking that it worked
  for( var id in sheetsById )
    Logger.log(id+' - '+sheetsById[id].getName());

  //usage example
  var sId2 = sheetsById[2];
  Logger.log('\n'+sId2.getName());
}

- 編集

もっと単純な関数を試してみましょう (ただし、私はそのようなループを行うのは好きではなく、後で使用するためにマップにデータを保存しません o(1))。

function getSheetById(ssID, sheetID) {
  var sheets = SpreadsheetApp.openById(ssID).getSheets();
  for( var i in sheets )
    if( sheets[i].getSheetId() == sheetID )
      return sheets[i];
  return null; //sheet id not found in spreadsheet, probably deleted?
}
于 2013-10-05T16:42:09.127 に答える
1

はい、シートIDがあります。その sheet.getSheetId. この ID はアプリ スクリプトから使用でき、シート URL を作成するために「実際の」GID に変換することもできます。(sheetId ^ 31578).toString(36) を実行して gid を取得します。私はそれを取得するためにそれをリバースする必要があり、それが永遠に機能することを保証することはできません.

于 2013-10-05T16:29:47.273 に答える