質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Google Apps Script

    1474questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

スプレッドシート内に複数のタブ(シート)がある場合の.getSheetByNameがうまく作動しない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 362

misato03

score 10

 課題:.getSheetByName がうまく動作しない(GAS)

 状況:

・スプレッドシート内に複数タブ(シート名:A,B,C,D,E)があり、それぞれを呼び出す.getSheetByNameを記述しているが、実行反映されるのがシート名:Eのみになってしまう

 やりたいこと:

・Twitterのフォロワーを自動取得
・参考スクリプト:https://yurilog.cc/3375
・5アカウントあるためシートを5つ作っている(シート名:A,B,C,D,E)ため、それぞれのシートが更新されるようにしたい

 やったこと:

・上記参考スクリプトをまず実装し挙動確認
・その後、.getSheetByName部分を各シート名(シート名:A,B,C,D,E)に変更
・毎日更新したいため、毎日0-1時でトリガーセット

function writeData() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('A');
  var today = Utilities.formatDate(new Date(), "JST","yyyy/MM/dd")
  var row = sheet.getLastRow() + 1;
  sheet.getRange(row, 1).setValue(today);
  getTwitterFollowers(row, 2);
}

function getTwitterFollowers(row, col) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName("A");

  var url = sheet.getRange(1, col).getValue();
  var postheader = {![イメージ説明](27c2c96675ed7aab8c8ffb6e5f85e377.png)
    "timeout":"50000"
  }
  var parameters = {
    "method":"get",
    "muteHttpExceptions": true,
    "headers": postheader
  }
  var html = UrlFetchApp.fetch(url, parameters).getContentText('UTF-8');
  Logger.log(html);  
  var searchTag = 'followers';
  var index = html.indexOf(searchTag)
  if (index !== -1) {
    html = html.substring(index + searchTag.length);
    //searchTag = '<div class="statnum">';
    //searchTag = 'data-count=';
    searchTag = 'title="';
    index = html.indexOf(searchTag);
    if (index !== -1) {
      html = html.substring(index + searchTag.length);
      //index = html.indexOf('</div>');
      //index = html.indexOf(' ');
      index = html.indexOf(' Followers"');
      if (index !== -1) {
        sheet.getRange(row, col).setValue(html.substring(0, index));
      }
    }
  }
}

イメージ説明

fanction名変更後のキャプチャ
イメージ説明

トリガー設定画面
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2018/11/14 15:12

    この場合、writeDataAの閉じカッコの最後にあるgetTwitterFollowersはgetTwitterFollowersAとしなければいけません。

    キャンセル

  • misato03

    2018/11/14 15:20

    なるほど!ありがとうございます、試してみます。ぜひ回答のほうにもコメント転記いただければ高評価つけさせていただきたく。ご検討くださいませ

    キャンセル

  • misato03

    2018/11/14 15:25

    できました!ありがとうございました!ぜひコメント欄のほうにも回答いただければ幸いです

    キャンセル

回答 2

checkベストアンサー

+1

引数で対応

とは、こういう感じです。未検証。
これで、loopAllだけトリガに設定すれば勝手に全部のシートを巡回してくれる(はず)。

ポイントを箇条書きで書くと、こういう感じですかね

  1. getsheetbynameを関数内でやるから同じことを繰り返してかかないといけない
  2. sheetを外から貰えばいい == 引数でうけとる
  3. ということは全部のシートを巡回してくれるやつがいる(loopAll)
  4. そのためには、フォロワーも書き込むのではなく、データだけ取って、書き込むところは一箇所にしたほうがいい
function loopAll() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheets = spreadsheet.getSheets(); //全部のシートが取れる
  for(var i = 0; i < sheets.length; i++) {
    const url = sheets[i].getRange(1, 2).getValue(); //シートからurlをとる
    const dat = [[Utilities.formatDate(new Date(), "JST","yyyy/MM/dd"), fetchTwitterFollowers(url)]]; //とったurlを関数に渡す
    appendTo(sheets[i], dat); //作ったデータを書いてもらう
  }
}

function appendTo(sheet, dat) { //末尾にデータを書くやつ、シートとデータは外からもらう
  const rowToSet = sheet.getLastRow() + 1;
  sheet.getRange(rowToSet, 1, dat.length, dat[0].length).setValues(dat);
}
function fetchTwitterFollowers(url) { //フォロワーだけ取得する(書き込まない)、urlは外からもらう
  const postheader = {
    "timeout":"50000"
  }
  const parameters = {
    "method":"get",
    "muteHttpExceptions": true,
    "headers": postheader
  }
  var html = UrlFetchApp.fetch(url, parameters).getContentText('UTF-8');
  var searchTag = 'followers';
  var index = html.indexOf(searchTag)
  if (index === -1) { return "error1"; }
  html = html.substring(index + searchTag.length);
  searchTag = 'title="';
  index = html.indexOf(searchTag);
  if (index === -1) { return "error2"; }
  html = html.substring(index + searchTag.length);
  index = html.indexOf(' Followers"');
  if (index === -1) { return "error3"; }
  return html.substring(0, index);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

たぶん全部同じfunction名にしているため、後勝ちになっているんだと思います。

  1. function名をすべてA~E固有につける
  2. functionA~Eをすべてトリガーを設定する。

あるいは

  1. function名をすべてA~E固有につける
  2. functionA~Eをすべて呼び出すfunction(親)を作成する
  3. 親functionをトリガーを設定する。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/14 15:23

    あー
    getTwitterFollowersも固有の関数名にしてください。

    ようは、同じプロジェクト上に同じ関数名を宣言しないでください。

    キャンセル

  • 2018/11/14 15:25

    functionわけずに引数で対応したほうがよい気がした。

    キャンセル

  • 2018/11/14 15:28

    papinianusさんからも同様の指摘をうけまして、変更してみたところ希望する挙動が確認できました!
    参考までに、
    >functionわけずに引数で対応
    というのがどういうことか、お手すきでお伺いできると非常に嬉しいです。ご検討いただけると幸いです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Google Apps Script

    1474questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。